¿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.
- ¿Cómo obtener un recurso de cadena en el adaptador ViewPager?
- FragmentPagerAdapter - cómo detectar un golpe o un clic de pestaña cuando el usuario va a una nueva pestaña?
- El fragmento secundario en el fragmento de visualizador de la vista desaparece después del intercambio
- Viewpager no funciona correctamente en lollipop 5.0 cuando uso otros fragmentos
- Establecer páginas previas en ViewPager
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?
- AdMob AdView y ViewPager?
- Cómo utilizar los elementos de la barra de herramientas con Viewpager + Fragmentos
- Obtención del error "La actividad Java.lang.IllegalStateException se ha destruido" al utilizar pestañas con ViewPager
- ViewPager dentro de Fragmento pierde su contenido cuando se vuelve a mostrar el fragmento
- Alinee las vistas secundarias en el centro de ViewPager android
- Reemplazar fragmento en ViewPager muestra pantalla en blanco?
- Android ViewPager y ListViews
- Cómo actualizar la vista actual en 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:
- La posición de los elementos agregados nunca cambia, entonces
getItemPosition
devuelvePOSITION_UNCHANGED
; - 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 (oPOSITION_NONE
) y olvidarPOSITION_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.