Когда следует getItemPosition рассматривать изменения позиции позиции?

Документация по методу getItemPosition в классе PagerAdapter от Android гласит, что это:

Вызывается, когда представление хоста пытается определить, изменилась ли позиция позиции.

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

Тем не менее, он никогда не указывает, когда переопределяющий метод должен учитывать позицию, которую нужно изменить. Означает ли это, что позиция отличается от положения, которое было в последний раз, когда был вызван элемент getItemPosition? Означает ли это, что позиция элемента отличается от последнего уведомления notifyDataSetChanged? Или это означает, что позиция элемента отличается от того, когда элемент был добавлен в viewPager?

Вы можете видеть в ViewPager.java, что getItemPosition вызывается только в dataSetChanged . Это означает, что позиция позиции изменилась, если она отличается от последнего, когда был вызван dataSetChanged .

Я бы не стал так беспокоиться о значении «изменился»; Есть два случая:

  1. Позиция добавленных элементов никогда не изменяется, затем getItemPosition возвращает POSITION_UNCHANGED ;
  2. Позиция элементов изменяется или элементы удаляются. Если позиция позиции не изменилась, нет никакой разницы, если вы POSITION_UNCHANGED или фактическую позицию. Таким образом, чтобы упростить реализацию, вы можете вернуть позицию (или POSITION_NONE ) и забыть о POSITION_UNCHANGED ..

По умолчанию позиции элементов в ViewPager считаются фиксированными; Вот почему getItemPosition() по умолчанию возвращает POSITION_UNCHANGED . Когда вы перемещаете элемент вокруг, ViewPager должен знать, где удалить элемент (старая позиция элемента) и где его добавить. Для этого используется getItemPosition() . Это позволяет вам указать ViewPager, какой элемент поставить туда, даже после того, как ваши страницы были созданы.

getItemPosition() вызывается только при вызове notifyDataSetChanged() на вашем PagerAdapter. По дизайну это означает, что «измененный» означает «сменился с того момента, когда последний раз ViewPager заполнял свои страницы», так как notifyDataSetChanged() заставляет ViewPager перерисовывать свои дети там, где это необходимо. Другими словами: «изменение» имеет либо значение, которое вы упомянули; Какой бы ни был последним.

Я думаю, что getItemPosition довольно сложно понять без образца. Посмотрите мой пример того, как использовать getItemPosition(...) здесь ; Я думаю, что это прояснит некоторые вещи.