ViewPager在屏幕旋转时保留旧片段

时间:2013-08-31 05:03:02

标签: android android-fragments android-viewpager

我正在使用ViewPagerFragmentStatePagerAdapter来显示片段。最初有2个片段添加了Fragment1和Fragment2,第3个片段Fragment3在收到服务器的响应后在第2个位置添加。因此,在添加所有页面之后,这应该是ViewPager中的片段序列 - > Fragment1,Fragment3,Fragment2。

问题是在添加Fragment1和Fragment3并且app在第二个位置添加第三个片段之前进行服务器调用如果我多次进行屏幕旋转然后添加第三个片段后它仍然显示位于第二个位置的Fragment2的旧副本最初在第2位和第3位有Fragment2的新副本。所以Fragment3 doest出现在ViewPager中。添加第3片段后的序列 - > Fragment1,Fragment2的旧版本,New Fragment2。

我正在覆盖onSaveInstanceState并在我的活动中调用super.onSaveInstanceState

我也尝试从POSITION_NONE返回getItemPosition。我在某处读到ViewPager保存片段的副本。同样通过调试,我检查了ViewPager在发布问题时包含2个Fragment2副本,即使getItem的{​​{1}}为每个位置返回了不同的片段,但仍然在第2个位置显示旧片段。为了在FragmentStatePagerAdapter进行测试,我为所有位置返回了Fragment1,这样所有3个页面都应该相同,但即使在第二个位置之后,当我再现上述步骤的问题时,它显示了Fragment2的旧副本。

那么如何清除getItem以便它不会保存旧片段。如何刷新ViewPager,以便它不会保留带有片段的旧副本。我认为问题在于onSaveInstanceState但我需要它。如何在ViewPager中保存视图时如何排除ViewPager。我尝试了onSaveInstanceState,但需要太多记忆。

我发现问题是mViewPager.setSaveEnabled(false)适配器的方法没有调用getItem,因为返回了旧的片段。

以下是解决方案代码

代码:

instantiateItem

2 个答案:

答案 0 :(得分:2)

仅在FragmentpagerAdapter

中覆盖此方法
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
       // TODO Auto-generated method stub
       super.destroyItem(ViewGroup container, int position, Object object);
}

然后删除super.destroyItem(ViewGroup container, int position, Object object); 来自你的代码

答案 1 :(得分:1)

我解决了这个问题,我在这里发布我的解决方案。我重写instantiateItem的{​​{1}}并在其中我从FragmentStatePagerAdapter获取对象,并将其类名与该位置上的对象的类名从我维护的片段列表中进行比较。

如果classname不相同,则其super.instantiateItem返回重复的片段。所以我在该位置拨打super.instantiateItem并再次致电destroyItem并从super.instantiateItem返回。

instantiateItem返回旧片段,因为在框架代码中,arraylist FragmentStatePagerAdapter具有重复片段,它只返回当前位置的片段。我认为它应该在列表中的位置与当前显示的片段进行比较,然后再返回它。