Изменить порядок ViewPager и обновить представления

У меня есть ViewPager с 10+ просмотрами. Я хочу иногда менять порядок страниц, т.е.

Страница 1 | Страница 2 | страница 3

to

Страница 3 | Страница 1 | Страница 2

Для вкладок, которые я использую ViewPagerIndicator, я могу обновить их порядок, изменив порядок моего адаптера и вызвав :

mViewPagerIndicator.notifyDataSetChanged();

Однако то, что я не могу обновить, — это содержимое ViewPager, например, если я обновлю адаптер ViewPager (до нового порядка, в котором я хочу, чтобы страницы были) и вызову:

mViewPager.getAdapter().notifyDataSetChanged()

Это не имеет никакого эффекта. Панель индикатора вкладок обновляется нормально, но содержимое страницы по-прежнему показывает старый порядок.

Есть ли способ изменить порядок страниц в адаптере ViewPager и заставить ViewPager перезагрузить все его представления?


Мой адаптер ViewPager расширяет FragmentStatePagerAdapter, и мои переопределенные методы следующие:

@Override
public Fragment getItem(int position) {
    return MyCustomFragment.newInstance();
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
    //super.destroyItem(container, position, object);  // Commented out to ensure views are not destroyed
}

Спасибо


person Mylo    schedule 07.11.2012    source источник


Ответы (2)


Это сложно сделать с FragmentStatePagerAdapter, потому что вам придется реализовать логику самостоятельно, но это намного проще с FragmentPagerAdapter, который уже предоставляет функциональность для этой цели.

Вызов .notifyDataSetChanged() вызывает getItemPosition(Object object)-метод вашего адаптера. Здесь вы должны предоставить ViewPager информацию о том, куда поместить фрагмент, переданный в параметре object, возвращая номер страницы, на которой вы хотите разместить фрагмент.

Пример того, как это сделать, ознакомьтесь с моим ответ здесь.

person Reinier    schedule 11.02.2013

Если производительность не очень важна, очень легко заставить FragmentStatePagerAdapter или FragmentPagerAdapter перерисовать (аннулировать) все свои представления/фрагменты: просто переопределите getItemPosition и вызовите notifyDataSetChanged(), как обычно.

@Override
public int getItemPosition(Object object) {
    return POSITION_NONE; //In source code, POSITION_NONE = -2 FYI
}

Для получения дополнительной информации ознакомьтесь с моим сообщением: Как использовать orderByKey() в порядке убывания вместо возрастания #Askfirebase

person SUPERCILEX    schedule 29.07.2016