1

i have a MainActivity with x number of fragments , switching between them using a viewpager. Each one of them making a network request using AsyncTaskLoader to retrieve some data.

doing the network request and retrieve the data is done for each fragment , and all fragments shows the correct data

The problem is : when i switching from Fragment_1 to Fragment_2 , and trying to go back to Fragment_1 , the data which was in Fragment_1 is Not Exist any more!!! How that come ???

Here are sample of my code :

MainActivity

    ViewPager mviewpager = (ViewPager) findViewById(R.id.homeScreen_section_2_viewpager);

    SimpleFragmentPagerAdapter mFragmentAdapter = new SimpleFragmentPagerAdapter(this, getSupportFragmentManager());

    mviewpager.setAdapter(mFragmentAdapter);




    // find the tab layout that shows the tabs
    android.support.design.widget.TabLayout tabLayout = (android.support.design.widget.TabLayout) findViewById(R.id.homeScreen_section_2_sliding_tabs);
    tabLayout.setupWithViewPager(mviewpager);
    tabLayout.setTabMode(tabLayout.MODE_SCROLLABLE);

FragmentPagerAdapter

public class SimpleFragmentPagerAdapter extends FragmentPagerAdapter {


private Context mContext;

public SimpleFragmentPagerAdapter(Context context, FragmentManager fm) {
    super(fm);
    mContext = context;
}

@Override
public int getCount() {
    return 5;
}


@Override
public CharSequence getPageTitle(int position) {
    if (position == 0) {
        return mContext.getString(R.string.category_Upcoming);
    } else if (position == 1) {
        return mContext.getString(R.string.category_Latest);
    } else if (position == 2) {
        return mContext.getString(R.string.category_NowPlaying);
    } else if (position == 3) {
        return mContext.getString(R.string.category_TopRated);
    } else
        return mContext.getString(R.string.category_Popular);


}

@Override
public android.support.v4.app.Fragment getItem(int position) {
    if (position == 0) {
        return new UpComingFragment();
    } else if (position == 1) {
        return new LatestFragment();
    } else if (position == 2) {
        return new NowPlayingFragment();
    } else if (position == 3) {
        return new TopRatedFragment();
    } else
        return new PopularFragment();
}
}

Fragment_1

 // Get a reference to the LoaderManager, in order to interact with loaders.
        loaderManager = getActivity().getSupportLoaderManager();
        loaderManager.initLoader(List_item_LOADER_ID, null, List_Item_loaderCallbacks);
private android.support.v4.app.LoaderManager.LoaderCallbacks<List<Movie>> List_Item_loaderCallbacks
        = new android.support.v4.app.LoaderManager.LoaderCallbacks<List<Movie>>() {

@Override
    public android.support.v4.content.Loader<List<Movie>> onCreateLoader(int id, Bundle bundle) {

        if (id == List_item_LOADER_ID) {
            return new MovieLoader(getActivity(), TOP_RATED_REQUEST_URL);
        } else
            return null;
    }

    @Override
    public void 
onLoadFinished(android.support.v4.content.Loader<List<Movie>> loader, List<Movie> data) {
        loadingIndicator.setVisibility(View.GONE);
        emptyTextView.setText("Empty Movies List ");

        // Clear the adapter of previous Movies data
         mAdapter.clear();
         trailers_List.clear();
         movies_IDs_list.clear();

        // If there is a valid list of {@link Movie}s, then add them to the adapter's
        // data set. This will trigger the ListView to update.
        if (data != null && !data.isEmpty()) {

            int size = data.size();
            for (int i = 0; i < size; i++) {
                movies_IDs_list.add(data.get(i).getMovie_id());
            }
            mAdapter.addAll(data);

            // call the "TrailerLinkLoader" to get trailers Links for Retrieved movies
            loaderManager.initLoader(Trailer_Link_LOADER_ID, null, Trailer_loaderCallbacks);
        }
    }


    @Override
    public void onLoaderReset(android.support.v4.content.Loader<List<Movie>> loader) {
        mAdapter.clear();
        movies_IDs_list.clear();
        trailers_List.clear();
    }
};

Fragment_2 Code and other Fragments Code : is similar to Fragment_1 Code as they all doing a network request to retrieve data of Different given Urls

Programmer
  • 31
  • 7
  • It is because you haven't retained your fragment state in the back stack. When the fragment is called after back stack it is recreated from onCreateView() again leading to the loss of data. There are various methods to save the data in bundles, shared preferences or databases. [link] (https://stackoverflow.com/questions/15313598/once-for-all-how-to-correctly-save-instance-state-of-fragments-in-back-stack) – Ishtdeep Hora Jan 09 '19 at 03:00

1 Answers1

3

Use mViewPager.setOffscreenPageLimit(NUMBER_OF_TAB -1); to remain the state of fragments. Anyway, it will take more RAM

Liar
  • 1,235
  • 1
  • 9
  • 19