Вставка страниц в середину FragmentPageAdapter

Я использую ViewPager из ViewPageIndicator, и мне нужно иметь возможность динамическивставлять один фрагмент в среднийдругих.

Я пытался управлять моделью с помощью FragmentPagerAdapterи FragmentStatePagerAdapter(оба из кода поддержки v4), и первый, кажется, никак не управляет вставкой страниц в середина. И второй работает, только если я делаю наивную реализацию getItemPosition, всегда возвращающую POSITION_NONE, но это приводит к полному воссозданию страниц каждый раз, когда я прокручиваю.

Проблема, которую я заметил с FragmentStatePagerAdapter (FSP), заключается в следующем:

  • Я начинаю с двух страниц [A][B]
  • Затем я вставляю [C] посередине [A][C][ Б]. После вставки я вызываю notifyDataSetchange()
  • Затем FSP вызывает getItemPosition для [A] и получает 0
  • Затем FSP вызывает getItemPosition для [B] и получает 2. И он говорит... для уничтожения [B] и создает mFragments.set(2, null), а затем, поскольку в массиве mFragments есть только два элемента, он генерирует исключение IndexOutOfBoundsException

. в середине. Это правильно или я что-то пропустил?

Обновление: Вставка в адаптер производится логично, при выполнении определенного условия страницы увеличиваются на единицу. Создание фрагмента выполняется с помощью конструктора в 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 (июнь 2012 г.) версию библиотеки поддержки Android. Потому что этот метод был добавлен в него.До этой версии этого метода не существовало, и адаптер неправильно управлял вставками. Также убедитесь, что вы используете FragmentPageAdapter, потому что FragmentStatePagerAdapter по-прежнему не работает, поскольку не использует идентификаторы.

15
задан lujop 28 July 2012 в 13:41
поделиться