RecyclerView.ViewHolder – getLayoutPosition vs getAdapterPosition
Dado que la nueva versión de la biblioteca de soporte (22.x), el método getPosition () de la clase RecyclerView.ViewHolder ha quedado obsoleto en lugar de los métodos mencionados en el tema. Realmente no tengo la diferencia de leer los documentos. ¿Podría alguien explicar la diferencia en términos de laicos, por favor?
Tengo el caso de uso siguiente – le doy a mi adaptador una lista, y también quiero poder asociar la información adicional para cada artículo de la lista. Tengo un mapeo de posición a extra, y la cartografía está disponible para los titulares para que puedan recoger el extra para su posición y hacer cosas con él. En el titular, ¿qué método debo utilizar?
- Bloc de vista de reciclador y problema de repetición
- Extraño comportamiento de las imágenes en RecyclerView
- Ocultar barra de desplazamiento de RecyclerView
- Agregue al oyente táctil para Firebase RecyclerView
- Cierre del cursor en onPostExecute no produce nada
¿Qué sucede con las posiciones del titular cuando los elementos de lista de los índices 0 y 1 son lugares conmutados? ¿Qué devuelven los métodos?
- Java.lang.IllegalStateException: RecyclerView no tiene LayoutManager en Fragmento
- Desplazamiento abrupto con NestedScrollView en ViewPager Fragmento dentro de un CoordinatorLayout Android
- ¿Cómo se puede agregar una línea de divisor en un Android RecyclerView?
- La barra de herramientas no se contrae con RecyclerView anidado
- Lazy Loading no funciona correctamente
- Problema de desplazamiento Infinito Infinito de RecyclerView
- ¿Número múltiple de columnas en un único StaggeredGridView?
- Android: RecyclerView dentro de un ScrollView (o paralaje)
Esta es una situación complicada, lo siento que los documentos no son suficientes.
Cuando cambia el contenido del adaptador (y llama a notify***()
) RecyclerView solicita un nuevo diseño. A partir de ese momento, hasta que el sistema de layout decida calcular un nuevo diseño (<16 ms), la posición del diseño y la posición del adaptador pueden no coincidir porque el diseño no ha reflejado los cambios del adaptador todavía.
En su caso de uso, ya que sus datos están relacionados con el contenido de su adaptador (y supongo que los datos se cambian al mismo tiempo con los cambios del adaptador), debería usar adapterPosition
.
Tenga cuidado, sin embargo, si está llamando a notifyDataSetChanged()
, ya que invalida todo, RecyclerView no sabe que la posición del adaptador ViewHolder hasta que se calcula la siguiente distribución. En ese caso, getAdapterPosition()
devolverá RecyclerView#NO_POSITION
( -1
).
Pero digamos que si has llamado notifyItemInserted(0)
, getAdapterPosition()
de ViewHolder que estaba previamente en la posición 0
comenzará a devolver 1
inmediatamente. Tan siempre y cuando usted está enviando granular notificar eventos, usted está siempre en buen estado (sabemos la posición del adaptador aunque la nueva disposición no se calcula todavía).
Otro ejemplo, si estás haciendo algo al hacer clic en el usuario, si getAdapterPosition()
devuelve NO_POSITION
, lo mejor es ignorar ese clic porque no sabes qué usuario ha hecho clic (a menos que tengas algún otro mecanismo, por ejemplo, IDs estables para buscar el elemento ).
Editar para cuando la posición de diseño es buena
Digamos que está utilizando LinearLayoutManager
y desea acceder al ViewHolder por encima del elemento que se ha pulsado. En ese caso, debe utilizar la posición de diseño para obtener el elemento anterior.
mRecyclerView.findViewHolderForLayoutPosition(myViewHolder.getLayoutPosition() - 1)
Tienes que usar la posición del diseño porque coincide con lo que el usuario está viendo en la pantalla.
- Configuración de android: animateLayoutChanges programmatically
- La animación de FragmentTransaction se desliza en la parte superior