¿Cuándo debería getItemPosition considerar cambios en la posición de un ítem?

La documentación para el método getItemPosition en la clase PagerAdapter de Android indica que es:

Se llama cuando la vista de host está intentando determinar si la posición de un elemento ha cambiado.

Se supone que este método se llama para indicar si ha cambiado o no la posición de un elemento en el grupo de elementos para ese adaptador.

Sin embargo, nunca indica cuándo un método dominante debe considerar la posición a ser cambiada. ¿Significa que la posición es diferente a la posición en la última vez que se llamó el elemento getItemPosition? ¿Significa que la posición del elemento es diferente a la última vez que se llamó notifyDataSetChanged? ¿O significa que la posición del elemento es diferente a cuando el elemento se agregó a la viewPager?

Usted puede ver en ViewPager.java que getItemPosition se llama sólo en dataSetChanged . Esto significa que la posición del elemento cambió si es diferente de la última vez que se llamó a dataSetChanged .

No me preocuparía tanto el significado de "cambiado"; Hay dos casos:

  1. La posición de los elementos agregados nunca cambia, entonces getItemPosition devuelve POSITION_UNCHANGED ;
  2. La posición de los elementos cambia o los elementos se eliminan. Si la posición del artículo no cambia, no hay diferencia si devuelve POSITION_UNCHANGED o la posición real. Así que para mantener la implementación sencilla puedes devolver la posición (o POSITION_NONE ) y olvidar POSITION_UNCHANGED .

De forma predeterminada, las posiciones de elementos en un ViewPager se consideran fijas; Es por eso que getItemPosition() devuelve por defecto POSITION_UNCHANGED . Cuando mueve un elemento alrededor, ViewPager tiene que saber dónde quitar un elemento (la posición antigua del elemento) y dónde añadirlo. Esto es para lo que se getItemPosition() . Le permite decirle al ViewPager qué elemento colocar donde, incluso después de que sus páginas han sido instanciadas.

getItemPosition() sólo se llama cuando llama a notifyDataSetChanged() en su PagerAdapter. Por diseño esto significa que "cambiado" significa "cambiado desde cuando el ViewPager último pobló sus páginas", como notifyDataSetChanged() hace que ViewPager redibuje a sus hijos donde sea necesario. En otras palabras: "cambiado" tiene cualquiera de los significados que usted mencionó; Cualquiera que sea el más reciente.

Creo que getItemPosition es bastante complicado de entender sin una muestra. Vea mi ejemplo de cómo usar getItemPosition(...) aquí ; Creo que aclara algunas cosas.

  • Después de la rotación, la transacción de fragmentos da IllegalStateException
  • ViewPager + FragmentStatePageAdapter: ¿qué significa esta advertencia "no actualizada en línea"?
  • Recuperar un fragmento de un ViewPager
  • SwipeRefreshLayout dentro de ViewPager
  • SetCurrentItem en ViewPager no se desplaza inmediatamente en la posición correcta
  • Botón en ViewPager desplazarse a la página específica
  • ViewPager page curl
  • Error al inflar TextInputLayout cuando se utiliza con ViewPager
  • ViewPager dentro de Fragmento pierde contenido al volver a él
  • Android ViewPager Excepción después de pulsar el botón Atrás
  • RecyclerView ViewPager java.lang.NullPointerException android.support.v7.widget.RecyclerView $ ItemAnimator $ ItemHolderInfo.left
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.