Не думаю, что в PagerAdapter
есть какая-либо ошибка.Проблема в том, что понять, как это работает, немного сложно.Глядя на решения, объясненные здесь, есть недопонимание и, следовательно, плохое использование экземпляров представлений с моей точки зрения.
Последние несколько дней я работал с PagerAdapter
и ViewPager
, и яобнаружил следующее:
Метод notifyDataSetChanged()
на PagerAdapter
только уведомит ViewPager
, что основные страницы изменились.Например, если вы создали / удалили страницы динамически (добавляя или удаляя элементы из вашего списка), ViewPager
должен позаботиться об этом.В этом случае я думаю, что ViewPager
определяет, следует ли удалять или создавать новое представление, используя методы getItemPosition()
и getCount()
.
Я думаю, что ViewPager
после вызова notifyDataSetChanged()
принимает его дочерние виды и проверяет их позицию с помощью getItemPosition()
.Если для дочернего представления этот метод возвращает POSITION_NONE
, ViewPager
понимает, что представление было удалено, вызывает destroyItem()
и удаляет это представление.
Таким образом, переопределяя getItemPosition()
длявсегда возвращать POSITION_NONE
совершенно неверно, если вы хотите обновить только содержимое страниц, потому что ранее созданные представления будут уничтожены, а новые будут создаваться при каждом вызове notifyDatasetChanged()
.Может показаться, что это не так неправильно только для нескольких TextView
с, но когда у вас есть сложные представления, такие как ListViews, заполненные из базы данных, это может быть реальной проблемой и пустой тратой ресурсов.
ТакСуществует несколько подходов для эффективного изменения содержимого представления без необходимости повторного удаления и создания экземпляра представления.Это зависит от проблемы, которую вы хотите решить. Мой подход заключается в использовании метода setTag()
для любого экземпляра представления в методе instantiateItem()
.Поэтому, когда вы хотите изменить данные или сделать недействительным нужное представление, вы можете вызвать метод findViewWithTag()
для ViewPager
, чтобы получить ранее созданное представление и изменить / использовать его так, как вам нужно, без необходимости удалять / создаватьновый вид каждый раз, когда вы хотите обновить какое-либо значение.
Представьте, например, что у вас есть 100 страниц со 100 TextView
с, и вы хотите периодически обновлять только одно значение.С подходами, объясненными ранее, это означает, что вы удаляете и создаете 100 TextView
s при каждом обновлении.Это не имеет смысла ...