Java 问题,切换到另一个片段后,片段数据被清除
我有一个main活动,其中x个片段,使用查看页面在它们之间切换。 他们中的每一个人都使用AsyncTaskLoader发出网络请求以检索一些数据 对每个片段执行网络请求和检索数据,并且所有片段都显示正确的数据 问题是: 当我从片段_1切换到片段_2,并尝试返回片段_1时,片段_1中的数据不再存在!!! 怎么会这样 以下是我的代码示例: main活动Java 问题,切换到另一个片段后,片段数据被清除,java,android,Java,Android,我有一个main活动,其中x个片段,使用查看页面在它们之间切换。 他们中的每一个人都使用AsyncTaskLoader发出网络请求以检索一些数据 对每个片段执行网络请求和检索数据,并且所有片段都显示正确的数据 问题是: 当我从片段_1切换到片段_2,并尝试返回片段_1时,片段_1中的数据不再存在!!! 怎么会这样 以下是我的代码示例: main活动 ViewPager mviewpager = (ViewPager) findViewById(R.id.homeScreen_sectio
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”说明了一切。这意味着你想保留多少看不见的碎片。这个答案救了我的命,谢谢你的帮助。