我正在使用来自ViewPageIndicator的ViewPager,我需要能够动态在其他人的中间中插入一个片段。
我尝试使用 FragmentPagerAdapter 和 FragmentStatePagerAdapter (均来自v4支持代码)管理模型,并且第一个似乎没有以任何方式管理插入中间的页面。 第二个只有在我完成 getItemPosition 的天真实现时才会有效,但是每次刷卡都会导致页面完全重新创建。
我在FragmentStatePagerAdapter(FSP)中观察到的问题是:
在代码中查看一下后,似乎提供的fragmentStatePagerAdapter不支持在中间插入。这是正确的还是我错过了什么?
更新 适配器中的插入是以逻辑方式进行的,当某个编码为真时,页面会增加1。片段创建是使用getItem()中的构造函数以这种方式完成的:
void setCondition(boolean condition) {
this.condition=condition;
notifyDataSetChanged();
}
public int getCount(){
return condition?3:2;
}
public Fragment getItem(int position) {
if(position==0)
return new A();
else if(position==1)
return condition?new C():new B();
else if(position==2 && condition)
return new B();
else throw new RuntimeException("Not expected");
}
public int getItemPosition(Object object) {
if(object instanceof A) return 0;
else if(object instanceof B) return condition?2:1;
else if(object instanceof C) return 1;
}
解决方案:
正如在接受的答案中所述,关键是实施getItemId()
。
确保至少使用R9(June 2012) version of android-support library。因为这个方法已添加到其中。在此版本之前,该方法不存在,并且适配器无法正确插入插入。 另外请确保使用 FragmentPageAdapter ,因为FragmentStatePagerAdapter仍然不起作用,因为它不使用ID。
答案 0 :(得分:5)
你忘记了一种方法
覆盖FragmentPagerAdapter
的{{3}},它只返回位置以返回识别片段实例的内容。
public long getItemId(int position) {
switch (position) {
case 0:
return 0xA;
case 1:
return condition ? 0xC : 0xB;
case 2:
if (condition) {
return 0xB;
}
default:
throw new IllegalStateException("Position out of bounds");
}
}