Загрузка данных из сервиса только один раз на фрагмент

#android #android-fragments

#Android #android-фрагменты

Вопрос:

У меня есть фрагмент, который загружает данные каждый раз, когда вы нажимаете на него, я хочу, чтобы его поведение было таким, чтобы, если я нажал на него один раз и перешел к другому фрагменту, когда я вернусь к нему, он не перезагружал данные и больше не показывал «Счетчик загрузки». Как мне это сделать? Это мой фрагмент кода:

 public ConsultantFragment() {
    // Required empty public constructor
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);//Make sure you have this line of code.
    setRetainInstance(true);
}

@Override
public View onCreateView(LayoutInflater inflater, final ViewGroup container,
                         Bundle savedInstanceState) {
    View consultantView = inflater.inflate(R.layout.fragment_consultant, container, false);
    //consultantList = new ArrayList<>();
    //consultantLisView = (ListView) consultantView.findViewById(R.id.consultant_listview);
    swipeRefreshLayout = (SwipeRefreshLayout) consultantView.findViewById(R.id.consultant_list_swipe_refresh);

    swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
        @Override
        public void onRefresh() {
            swipeRefreshLayout.setRefreshing(false);
            retrieveConsultantList();    
            consultantRecyclerView.setAdapter(consultantRecylerViewAdapter);
        }
    });

    consultantRecyclerView = (RecyclerView) consultantView.findViewById(R.id.consultant_recyclerview);
    setUpDialog();

    FloatingActionButton createConsultantFab = (FloatingActionButton) consultantView.findViewById(R.id.add_consultant);
    createConsultantFab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent createConsultantIntent = new Intent(getContext(), CreateConsultantActivity.class);
            startActivity(createConsultantIntent);

        }

    });

    ((AppCompatActivity) getActivity()).getSupportActionBar().setTitle(R.string.consultant_list_title);

    retrieveConsultantList();

    return consultantView;
}

public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    // inflater.inflate(R.menu.main, menu);
    super.onCreateOptionsMenu(menu, inflater);


    searchMenuItem = menu.findItem(R.id.action_search);
    searchView = (SearchView) searchMenuItem.getActionView();
    searchView.setSubmitButtonEnabled(true);
    searchView.setOnQueryTextListener(this);
    /// searchView.setSubmitButtonEnabled(true);
    searchView.setOnQueryTextListener(this);
}

@Override
public boolean onQueryTextSubmit(String query) {
    return false;
}

@Override
public boolean onQueryTextChange(String newText) {

    consultantRecylerViewAdapter.getFilter().filter(newText);
    consultantRecylerViewAdapter.notifyDataSetChanged();
    return false;
}

private void setUpConsultantRecyclerView(List<Consultant> consultantList) {


    consultantRecylerViewAdapter = new ConsultantRecylerViewAdapter(getContext(), consultantList);
    consultantRecyclerView.setAdapter(consultantRecylerViewAdapter);

    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getContext());
    linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
    consultantRecyclerView.setLayoutManager(linearLayoutManager);

    consultantRecyclerView.setItemAnimator(new DefaultItemAnimator());
}

public void setUpDialog() {
    consultantListLoadingDialog = ProgressDialog.show(getContext(),
            "Loading consultant",
            "Please wait");
}

private void retrieveConsultantList() {
    final StringRequest consultantStringRequest = new StringRequest(Request.Method.GET,
            Constants.BASE_URL.concat(Constants.CONSULTANT_KEY_WORD),
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    //eventList =  new ArrayList<>();
                    JsonDataParser parseJSON = new JsonDataParser();
                    setUpConsultantRecyclerView(parseJSON.jsonArrayToConsultantList(response));
                    consultantListLoadingDialog.dismiss();
                    //consultantListAdapter.addAll();
                }
            }, new Response.ErrorListener() {

                @Override
                public void onErrorResponse(VolleyError error) {

               }
         });
    VolleyRequestQueue.getInstance(getContext()).addToRequestQueue(consultantStringRequest);
}
  

}

Комментарии:

1. Сохраните ваши данные в пакете, переопределив onSaveInstanceState(Bundle outState) и извлеките их оттуда. Смотрите это

2. Вы можете сохранить arraylist в onSaveInstanceState(Bundle outState) методе или сохранить в базе данных и загружать данные из БД при загрузке фрагмента во второй раз. Также для предотвращения использования .add() метода перезагрузки фрагмента вместо .replace() транзакции фрагмента.

3. Используете ли вы viewpager для обработки фрагментов?

Ответ №1:

Удалите свой метод, который получает результаты с сервера из onCreateView. onCreateView вызывается все время при замене фрагментов. Вместо этого выполняйте одноразовую работу в onCreate.

 @Override
public void onCreate(Bundle savedInstance) {
    super.onCreate(savedInstance);
   retrieveConsultantList();
}
  

Комментарии:

1. Он по-прежнему показывает счетчик, когда я удаляюсь от фрагмента и снова открываю его @rahul

2. Переместить setUpDialog(); в onCreate

3. Это все равно не помогает @rahul

4. Вы удалили retrieveConsultantList() и setUpDialog() из onCreateView? Любой другой метод, который необходим на один раз, должен существовать в onCreate вместо onCreateView