1

I have a fragment that loads data everytime you click on it, I want its behavior to be in a way that if I clicked on it once and moved to another fragment when I go back to it, it does not reload the data and it does not show the "Loading spinner" anymore. How do I do that? This is my fragment code:

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);
}

}

vidulaJ
  • 1,232
  • 1
  • 16
  • 31
Fuluza
  • 109
  • 2
  • 13
  • Save your data in bundle by overriding onSaveInstanceState(Bundle outState) and retrieve it from there. See [this](https://developer.android.com/reference/android/app/Fragment.html) – Developer Oct 18 '16 at 09:37
  • You can store arraylist in `onSaveInstanceState(Bundle outState)` method or store in database and load data from db when fragment load second time. Also to prevent reload fragment use `.add()` method instead of `.replace()` for fragment transaction. – Piyush Oct 18 '16 at 10:03
  • Are you using viewpager for handling fragments? – Brijesh Kumar Oct 18 '16 at 10:05

1 Answers1

0

Remove your method which is getting results from the server from onCreateView. onCreateView called all time when you replace fragments. Instead do one time work in onCreate.

@Override
public void onCreate(Bundle savedInstance) {
    super.onCreate(savedInstance);
   retrieveConsultantList();
}
Rahul
  • 10,457
  • 4
  • 35
  • 55