2012-04-05 2 views
9

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

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

ответ

13

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

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

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

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

mAdapter.notifyDataSetChanged(); 
+1

Спасибо, но в качестве побочного эффекта производительность для изменения страниц сильно уменьшилась. Как 2 секунды для изменения страниц на вкладке Galaxy 10'1 (событие ввода-вывода Google). Перед вашим предложением это было мгновенно. –

+0

Спасибо, вы сэкономите мое время! – ihrupin

Смежные вопросы