anu*_*har 5 android android-fragments android-viewpager
我正在使用ViewPager并FragmentStatePagerAdapter显示片段.最初有2个片段添加了Fragment1和Fragment2,第3个片段Fragment3在收到服务器的响应后在第2个位置添加.因此,在添加所有页面之后,这应该是ViewPager中的片段序列 - > Fragment1,Fragment3,Fragment2.
问题是在添加了Fragment1和Fragment3之后,如果我在第二个位置添加第三个片段,应用程序正在进行服务器调用,如果我多次进行屏幕旋转,那么在添加第三个片段之后它仍然显示最初在第二个位置处于第二个位置的Fragment2的旧副本位置和第三位置有Fragment2的新副本.所以Fragment3 doest出现在ViewPager中.添加第3片段后的序列 - > Fragment1,Fragment2的旧拷贝,New Fragment2.
我重写onSaveInstanceState,并呼吁super.onSaveInstanceState在我的活动.
我也试过回来POSITION_NONE了getItemPosition.我在某处读到ViewPager保存片段的副本.还可以通过调试我检查了ViewPager包含Fragment2 2份时问题重现,即使getItem的FragmentStatePagerAdapter每个位置返回不同的片段,但仍处于第2位有人出老片段.出于测试目的,getItem我返回Fragment1中的所有位置,以便所有3个页面应该相同,但即使在第二个位置之后,当我再现上述步骤的问题时,它显示了Fragment2的旧副本.
所以如何清除ViewPager它不会保存旧碎片.如何刷新ViewPager,以便它不会保留带有片段的旧副本.我认为问题在于onSaveInstanceState但我需要它.如何ViewPager在保存视图时排除onSaveInstanceState.我尝试过,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;
}
}
Run Code Online (Sandbox Code Playgroud)
我解决了这个问题,我在这里发布我的解决方案。我覆盖instantiateItem并FragmentStatePagerAdapter在其中获取对象,super.instantiateItem并将其类名与我正在维护的片段列表中该位置的对象的类名进行比较。
如果类名不同,则其均值super.instantiateItem返回重复片段。所以我destroyItem在那个位置调用并再次调用super.instantiateItem并从instantiateItem.
FragmentStatePagerAdapter返回旧片段,因为在框架代码中 arraylistmFragments有重复的片段,它只返回当前位置的片段。我认为它应该在返回之前将列表中位置的片段与当前显示的片段进行比较。
| 归档时间: |
|
| 查看次数: |
4717 次 |
| 最近记录: |