Posición en RecyclerView

Generalmente configuramos el evento de clic en onBindViewHolder

En la respuesta al método de evento de clic, usamos directamente la posición del parámetro en el método onBindViewHolder para recuperar los datos y realizar la operación correspondiente. . ¿Está esto realmente bien? Si simplemente muestra los datos sin realizar ninguna modificación, está bien.

Cuando necesitamos eliminar datos, como eliminar los datos del primer elemento, esta posición ya no es precisa.

Vea el efecto de ejecución a continuación

ViewHolder nos proporciona el método getAdapterPosition para obtener la posición de ViewHolder. Este método siempre devuelve la última posición de ViewHolder, lo que significa que al usar este método, incluso si se llama a métodos como notifyItemXX() para eliminar/agregar/cambiar los datos de RecyclerView, la posición devuelta por este método puede garantizar que el La posición obtenida es correcta.

Desafortunadamente este método está en desuso.

Si ha utilizado MergeAdapter, estará familiarizado con el anidamiento de adaptadores. Es como un contenedor, agréguele diferentes adaptadores y luego configure MergeAdapter en RecyclerView, para que se puedan lograr múltiples tipos. Del elemento, y cada tipo de lógica está en un Adaptador independiente, que también puede lograr un cierto grado de desacoplamiento.

En este caso, si continuamos llamando a getAdapterPosition, causará ambigüedad, porque es posible que el programa no sepa si desea la posición relativa de ViewHolder o la posición absoluta.

Los nombres de posición relativa y posición absoluta aquí no son nombres oficiales, sino un concepto similar propuesto con referencia a rutas relativas y rutas absolutas en el sistema de archivos. Pongamos un ejemplo de qué son la posición relativa y la posición absoluta. Como se muestra en el siguiente ejemplo: MergeAdapter contiene un Adaptador y un Adaptador B. En la visualización de la página, B está detrás de A. Queremos obtener la posición de un elemento b3 en B. Hay dos posiciones en este momento: b3 está en The. posición en B, la llamo posición relativa, y la posición de b3 en todo RecyclerView, la llamo posición absoluta.

Los dos métodos proporcionados oficialmente, getBindingAdapterPostion y getAbsoluteAdapterPosition, se utilizan para obtener la posición relativa y la posición absoluta de ViewHolder.

Al configurar un evento de clic, a menudo usamos getBindingAdapterPostion para obtener el elemento de datos correspondiente a ViewHolder para completar la operación de clic.

Al operar el estado de desplazamiento de RecyclerView, debe usar getAbsoluteAdapterPosition para realizar operaciones relacionadas.

getLayoutPosition, como sugiere el nombre, sirve para obtener la posición de ViewHolder en el diseño real. Dado que representa la posición en el diseño real, este método solo puede obtener el valor correcto una vez que se completa el diseño.

Las posiciones en el diseño y el adaptador suelen ser las mismas. Pueden ser diferentes solo cuando el contenido en el Adaptador cambia y el Diseño no ha tenido tiempo de dibujarse. Este tiempo es inferior a 16 ms.

Si se llama a notifyDataSetChanged(), debido a que es necesario volver a dibujar todos los elementos, RecyclerView no conoce la posición del adaptador antes de que se complete el dibujo y devolverá -1 (NO_POSITION).

Pero si se utiliza notifyItemXX(), la posición del adaptador correcta se puede obtener inmediatamente, incluso si el nuevo diseño aún no se ha dibujado. Por ejemplo, cuando se llama a notifyItemInserted (0), lo que antes era 0 ahora se convertirá en 1, porque se inserta 0, lo que es equivalente a lo que RecyclerView ha calculado para usted de antemano. En este momento, getLayoutPosition solo puede obtener el valor anterior.

En general, en la mayoría de los casos, al usar getAdapterPosition, siempre puede obtener el valor de posición correcto de inmediato, siempre y cuando no use notifyDataSetChanged() para actualizar los datos.