Java 问题,切换到另一个片段后,片段数据被清除

Java 问题,切换到另一个片段后,片段数据被清除,java,android,Java,Android,我有一个main活动,其中x个片段,使用查看页面在它们之间切换。 他们中的每一个人都使用AsyncTaskLoader发出网络请求以检索一些数据 对每个片段执行网络请求和检索数据,并且所有片段都显示正确的数据 问题是: 当我从片段_1切换到片段_2,并尝试返回片段_1时,片段_1中的数据不再存在!!! 怎么会这样 以下是我的代码示例: main活动 ViewPager mviewpager = (ViewPager) findViewById(R.id.homeScreen_sectio

我有一个main活动,其中x个片段,使用查看页面在它们之间切换。 他们中的每一个人都使用AsyncTaskLoader发出网络请求以检索一些数据

对每个片段执行网络请求和检索数据,并且所有片段都显示正确的数据

问题是: 当我从片段_1切换到片段_2,并尝试返回片段_1时,片段_1中的数据不再存在!!! 怎么会这样

以下是我的代码示例:

main活动

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

    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);
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();
}
}
片段_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();
    }
};
//获取对LoaderManager的引用,以便与Loader交互。
loaderManager=getActivity().getSupportLoaderManager();
initLoader(List\u item\u LOADER\u ID,null,List\u item\u LOADER回调);
私有android.support.v4.app.LoaderManager.LoaderCallbacks列表\u项目\u LoaderCallbacks
=新的android.support.v4.app.LoaderManager.LoaderCallbacks(){
@凌驾
public android.support.v4.content.Loader onCreateLoader(int-id,Bundle){
if(id==列表项装入器id){
返回新的MovieLoader(getActivity(),顶级请求URL);
}否则
返回null;
}
@凌驾
公共空间
onLoadFinished(android.support.v4.content.Loader,列表数据){
加载indicator.setVisibility(View.GONE);
setText(“空电影列表”);
//清除先前电影数据的适配器
mAdapter.clear();
拖车列表。清除();
电影_id_list.clear();
//如果存在有效的{@link Movie}列表,则将它们添加到适配器的
//数据集。这将触发ListView更新。
if(data!=null&&!data.isEmpty()){
int size=data.size();
对于(int i=0;i

Fragment_2代码和其他片段代码:类似于Fragment_1代码,因为它们都执行网络请求以检索不同给定URL的数据使用mviewpage.setOffscreenPageLimit(选项卡的编号-1)以保持片段的状态。无论如何,这将需要更多的RAM,因为您没有在后堆栈中保留片段状态。当在后堆栈后调用片段时,它将再次从onCreateView()重新创建,从而导致数据丢失。有多种方法可以将数据保存在捆绑包、共享首选项或数据库中。[链接]()实际上我发现一个链接说的是相同的答案(),但它使用的是(标签的数量)而不是(标签的数量-1),有什么区别?很高兴听到这个!你能告诉我为什么要使用(numTabs-1)而不是(numTabs)“OffscreenPage”说明了一切。这意味着你想保留多少看不见的碎片。这个答案救了我的命,谢谢你的帮助。