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?

¿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?

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.

  • Recyclerview y manejo de diferentes tipos de hilera de inflación
  • RecyclerView horizontal con relleno inicial
  • Android setOnScrollListner en RecyclerView obsoleta
  • Recyclerview + Proveedor de contenido + CursorLoader
  • Combinar múltiples RecyclerView.Adapter para usar con RecyclerView único (Android)
  • Sdk mínimo para recycleview y pros / contras de reemplazar listas con ella
  • ¿Cómo utilizo un GridLayoutAnimation en un RecyclerView?
  • Desplazar SwipeRefreshLayout con RecyclerView Actualizar en cualquier lugar de android 2.2
  • Recycler View Adapter con EditText
  • Agregue RecyclerView (RecyclerFragment) a un cuadro de diálogo
  • Animar RecyclerView al desplazarse
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.