【发布时间】:2016-10-12 12:38:38
【问题描述】:
我有一个创建 viewpager 适配器 (FragmentStatePagerAdapter) 并将 viewpager 设置为此适配器的活动。
这就是 viewpager 适配器的创建方式和设置到 viewpager 小部件的方式。
viewPageAdapter = new viewPageAdapter(getSupportFragmentManager(), getApplicationContext());
mCustomSwipeViewPager.setAdapter(viewPageAdapter);
这就是我创建 viewPageAdapter 的方式
public class viewPagerAdapter extends FragmentStatePagerAdapter {
private SparseArray<Fragment> registeredFragments = new SparseArray<Fragment>();
public viewPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
// returning newly created fragment
}
@Override
public int getCount() {
// returning total count
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
Fragment fragment = (Fragment) super.instantiateItem(container, position);
// This is where i am putting created fragment in the sparse array,
// which i will be accessing in the activity based on position
// for updating fragment views.
registeredFragments.put(position, fragment);
return fragment;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
// And here i am removing it from the sparse array
registeredFragments.remove(position);
super.destroyItem(container, position, object);
}
}
现在,我转到开发者选项并选中“不保留活动”。
问题就从这里开始了,往前推进这个activity,这个activity会被销毁,这很好。
现在,如果我回来,在 onCreate() 中会创建一个新适配器并设置为 viewpager,但它不会再次调用 getItem(),而是调用 instantiateItem( ),内存中的片段为空。
我在调试模式下检查了fragmentmanager,片段管理器将两个片段保存为activestate,所有片段字段为空。
我尝试过的事情......
- 尝试使用 onDestroy() 清除活动中的片段管理器 fragmentManager.getFragments.clear() 但没有运气。
- 将适配器的 getItemCount() 设为 0,并在 onDestroy() 中调用适配器的 notifydatasetChanged(),结果仍然相同。
但是,如果注释掉活动的 super.onSavedInstance(),它工作正常,但这不是我想要的,因为它在少数情况下会失败。
如果我创建一个新适配器并再次将其设置为 viewpager,它应该重新开始,即应该从第一个位置调用 getItem() 而不最小化 fragmentStateViewPagerAdapter 的性能。
我们将不胜感激任何形式的帮助或建议。
【问题讨论】:
-
试试 Kathan Shah 在这篇帖子上的回答 stackoverflow.com/questions/40293118/…
标签: android-fragments android-viewpager fragmentstatepageradapter