在FragmentPagerAdapter的中间插入页面

时间:2012-05-31 19:43:28

标签: android android-viewpager android-adapter viewpagerindicator

我正在使用来自ViewPageIndicator的ViewPager,我需要能够动态在其他人的中间中插入一个片段。

我尝试使用 FragmentPagerAdapter FragmentStatePagerAdapter (均来自v4支持代码)管理模型,并且第一个似乎没有以任何方式管理插入中间的页面。 第二个只有在我完成 getItemPosition 的天真实现时才会有效,但是每次刷卡都会导致页面完全重新创建。

我在FragmentStatePagerAdapter(FSP)中观察到的问题是:

  • 我从两页[A] [B]
  • 开始
  • 然后我在[A] [C] [B]中插入[C]。插入后我调用 notifyDataSetchange()
  • 然后FSP为[A]调用getItemPosition并获得0
  • 然后FSP为[B]调用geTItemPosition并得到2.并且它说......哦,我要销毁[B]并制作mFragments.set(2,null)然后因为它在mFragments中只有两个元素array抛出一个IndexOutOfBoundsException

在代码中查看一下后,似乎提供的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。

1 个答案:

答案 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");
    }
}