2013-08-31 60 views
5

我使用ViewPagerFragmentStatePagerAdapter来显示片段。最初有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,即使getItemFragmentStatePagerAdapter为每个位置返回不同的片段,但仍然在第二个位置显示旧的片段。为了在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; 
      } 
     } 
+0

你检查[呢?](http://stackoverflow.com/a/9646622/1396082) –

+0

你删除了你的评论..现在它为你工作? –

+0

问题是适配器的instantiateItem方法由于返回了旧片段而未调用getItem。我正在寻找一种方法使其调用getItem。 – anujprashar

回答

1

我解决了这个问题,我在这里发布我的解决方案。我重写instantiateItemFragmentStatePagerAdapter,在它里面,我得到super.instantiateItem的对象,并将它的类名与我正在维护的片段列表中该对象的类名进行比较。

如果classname不相同,则表示super.instantiateItem的平均值将返回重复的片段。所以我在该位置打电话destroyItem,并再次拨打super.instantiateItem并从instantiateItem返回。

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

+2

你能告诉我一些(虚拟)代码吗?我不明白你的解决方案,只是用文字(对不起,英文不好)。 – Poutrathor

+0

@Poutrathor对不起,延迟回复。我在答案中添加了代码。 – anujprashar

+0

可以请您发布代码吗? – k2ibegin

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);