Я использую ViewPager из ViewPageIndicator, и мне нужно иметь возможность динамическивставлять один фрагмент в среднийдругих.
Я пытался управлять моделью с помощью FragmentPagerAdapterи FragmentStatePagerAdapter(оба из кода поддержки v4), и первый, кажется, никак не управляет вставкой страниц в середина. И второй работает, только если я делаю наивную реализацию getItemPosition, всегда возвращающую POSITION_NONE, но это приводит к полному воссозданию страниц каждый раз, когда я прокручиваю.
Проблема, которую я заметил с FragmentStatePagerAdapter (FSP), заключается в следующем:
. в середине. Это правильно или я что-то пропустил?
Обновление: Вставка в адаптер производится логично, при выполнении определенного условия страницы увеличиваются на единицу. Создание фрагмента выполняется с помощью конструктора в 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 по-прежнему не работает, поскольку не использует идентификаторы.