Уничтожить страницы в 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, вторая созданная страница будет иметь правильный синий цвет.

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

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

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

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

 mAdapter.notifyDataSetChanged();