我使用ViewPager
和FragmentStatePagerAdapter
来显示片段。最初有2个片段添加Fragment1和Fragment2,第3个片段Fragment3在收到来自服务器的响应后被添加到第2个位置。因此,在添加所有页面后,这应该是ViewPager中的碎片序列 - > Fragment1,Fragment3,Fragment2。ViewPager屏幕旋转时保留旧片段
问题是在Fragment1和Fragment3被添加和应用程序正在服务器调用之前添加第3个片段在第2个位置,如果我做屏幕旋转多次,然后在第3个片段添加它仍然显示Fragment2的旧副本在第2最初位置在第二位和第三位有Fragment2的新副本。所以Fragment3 doest显示在ViewPager中。添加第3个片段后的序列 - > Fragment1,Fragment2的新副本,New Fragment2。
我重写onSaveInstanceState
并在我的活动中调用super.onSaveInstanceState
。
我还试着从getItemPosition
返回POSITION_NONE
。我在某处阅读ViewPager保存片段的副本。同样通过调试,我检查了ViewPager在复制问题时包含2份Fragment2,即使getItem
的FragmentStatePagerAdapter
为每个位置返回不同的片段,但仍然在第二个位置显示旧的片段。为了在getItem
中进行测试,我为所有职位返回了Fragment1,这样所有3个页面应该都是相同的,但是在第二个位置之后,当我使用上述步骤再现问题时,它显示的是Fragment2的旧副本。
那么如何清除ViewPager
以便它不保存旧的碎片。如何刷新ViewPager,以便它不保留带有碎片的旧副本。我认为问题是与onSaveInstanceState,但我需要它。当视图保存在onSaveInstanceState
中时,如何排除ViewPager
。我试过mViewPager.setSaveEnabled(false)
但它占用太多内存。
我发现问题是instantiateItem
适配器的方法没有调用getItem,因为返回了旧的片段。
下面是解决方案代码
代码:
@Override
public Object instantiateItem(ViewGroup container, int position) {
Object obj = super.instantiateItem(container, position);
Fragment fragment = mFragments.get(position);
if((obj!=null && fragment!=null) && !(obj.getClass().getSimpleName().equals(fragment.clss.getSimpleName()))){
destroyItem(container, position, obj);
return super.instantiateItem(container, position);
}else{
return obj;
}
}
你检查[呢?](http://stackoverflow.com/a/9646622/1396082) –
你删除了你的评论..现在它为你工作? –
问题是适配器的instantiateItem方法由于返回了旧片段而未调用getItem。我正在寻找一种方法使其调用getItem。 – anujprashar