我正在使用
问题是,在添加 Fragment1 和 Fragment3 并在添加第三个片段到第二个位置之前,应用程序进行服务器调用并多次旋转屏幕后,即使添加了第三个片段,它仍然显示旧的 Fragment2 副本,该副本最初位于第二个位置,并且第二个位置和第三个位置有 Fragment2 的新副本。因此,Fragment3 在 ViewPager 中不会显示。添加第三个片段后的顺序为 --> Fragment1、Fragment2 的旧副本、新的 Fragment2。
我重写了 Activity 的
另外,我尝试从
因此,如何清除 ViewPager,使其不保存旧的片段。如何刷新 ViewPager,使其不保留带有片段的旧副本。我认为问题出在 onSaveInstanceState 上,但我需要它。如何在保存视图时排除 ViewPager。我尝试过
我发现问题是适配器的
下面是解决方案代码:
ViewPager
和 FragmentStatePagerAdapter
来显示片段。最初添加了两个片段 Fragment1 和 Fragment2,然后在从服务器接收响应后将第三个片段 Fragment3 添加到第二个位置。因此,在添加所有页面之后,ViewPager 中的片段顺序应为 --> Fragment1、Fragment3、Fragment2。问题是,在添加 Fragment1 和 Fragment3 并在添加第三个片段到第二个位置之前,应用程序进行服务器调用并多次旋转屏幕后,即使添加了第三个片段,它仍然显示旧的 Fragment2 副本,该副本最初位于第二个位置,并且第二个位置和第三个位置有 Fragment2 的新副本。因此,Fragment3 在 ViewPager 中不会显示。添加第三个片段后的顺序为 --> Fragment1、Fragment2 的旧副本、新的 Fragment2。
我重写了 Activity 的
onSaveInstanceState
方法,并调用了 super.onSaveInstanceState
。另外,我尝试从
getItemPosition
返回 POSITION_NONE
。我在某个地方读到 ViewPager 保存片段的副本。还通过调试检查了当出现问题时 ViewPager 包含 2 个 Fragment2 的副本,即使 FragmentStatePagerAdapter
的 getItem
为每个位置返回不同的片段,但在第二个位置仍然显示旧片段。为了测试目的,在 getItem
中,我为所有位置返回 Fragment1,以便所有 3 个页面都应相同,但即使在上述步骤中重现问题时,第二个位置仍显示 Fragment2 的旧副本。因此,如何清除 ViewPager,使其不保存旧的片段。如何刷新 ViewPager,使其不保留带有片段的旧副本。我认为问题出在 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;
}
}