Уничтожить страницы на ViewPager и FragmentStatePagerAdapter

Мы пытаемся создать приложение для Android на основе ViewPager, которое во время выполнения получает инструкции по добавлению и удалению страниц. Почти как в браузере с вкладками, вы можете удалить текущую вкладку или удалить конкретную вкладку.

Следуя документации Google, мы используем FragmentStatePagerAdapter, который предназначен для использования в ситуациях, когда имеется большое количество страниц, работая больше как представление списка.

Но когда мы пытаемся: - удалить страницу, которой нет на экране - и создать новый объект-фрагмент из того же класса - и на той же позиции удаленной страницы, мы заметили, что платформа Android восстанавливает мертвую страницу и отображает ее. пользователю. Новый объект, который мы только что создали, просто не запускается «onCreate», «onCreateView» или «onActivityCreated».

Мы ищем способы исправить эту проблему, заставляющую платформу использовать наш новый объект фрагмента из того же класса. Есть идеи?

Мы выяснили, что если мы уничтожим текущую страницу, платформа действительно уничтожит страницу и создаст новый объект из того же класса. Вот небольшой пример, воспроизводящий проблему и это поведение.

Источник: http://dl.dropbox.com/u/8333012/SimpleAdapter/SimplePager.zip

Видео: http://www.youtube.com/watch?v=-oaXXwU8PSI&hd=1

В этом проекте, когда вы касаетесь TextView на первой странице, он был разработан для удаления второй страницы (зеленой) на новую синюю страницу. Вы увидите, что даже если сделать это с первой страницы, вторая страница останется зеленой. Но когда вы нажимаете кнопку «Назад» Android на второй странице (зеленая) и касаетесь TextView, вторая созданная страница будет правильного синего цвета.


person Jose Faria    schedule 05.04.2012    source источник


Ответы (1)


Когда вы имеете дело с ListView и изменяете базовые данные вашего адаптера, вы вызываете notifyDataSetChanged(), и любое представление, отражающее набор данных, обновится. То же самое вы должны сделать и с адаптером фрагментного пейджера.

В вашем случае вы не уведомляете адаптер. Однако в случае FragmentPagerAdapter/FragmentStatePagerAdapter это не имеет значения, поскольку эти адаптеры игнорируют notifyDataSetChanged() «по умолчанию». Чтобы заставить его работать, переопределите getItemPosition() в реализации вашего адаптера.

@Override
public int getItemPosition(Object object) {
    return POSITION_NONE;
}

И как уже было сказано, после добавления/удаления фрагментов звоните (в вашем showOtherPage())

mAdapter.notifyDataSetChanged();
person 207    schedule 06.04.2012
comment
Спасибо, но в качестве побочного эффекта производительность по смене страниц сильно снизилась. Как 2 секунды, чтобы сменить страницу на Galaxy Tab 10'1 (событие Google I/O). До вашего предложения это было мгновенно. - person Jose Faria; 09.04.2012