Lo que developer.android.com está hablando de RecyclerView

Saludos, querido harazhiteli! Esta publicación me impulsó a escribir un artículo (o más bien, la sensación de un fuerte aumento de la temperatura local en el área ... hmm, espalda baja, que generalmente ocurre cuando alguien está equivocado en Internet).


Comencemos desde el principio. Estoy completamente de acuerdo en que "hay algo en común entre el ciclo de vida de la actividad y el trabajo de RecyclerView" , esto es "algo", la necesidad de comprender lo que estamos haciendo y por qué. Y lee la documentación. Y el incumplimiento de estas dos necesidades, como el sueño de la razón, da lugar a monstruos. Solo aquí, con la forma en que el autor anterior ofrece luchar contra estos monstruos, estoy totalmente en desacuerdo.


Considere 2 condiciones.


Condición No. veces


Si cuelga un oyente en algún lugar, entonces en otro lugar debe desconectarlo. Por lo general, hacen esto en funciones simétricas: adjuntar a onViewAttachedToWindow , eliminarlo a onViewDetachedFromWindow . Adjuntamos onBindViewHolder ... No adjuntamos onBindViewHolder . Esta llamada no es simétrica, se puede llamar varias veces según las diferentes condiciones. No hay necesidad de complicarte la vida.


Si usted, como el autor del artículo original, tiene el pensamiento: "Pero hay casos en que ... en el oyente es necesario tener en cuenta la posición del elemento en la lista, cuyo acceso está disponible en el método onBindViewHolder () y está ausente en onViewAttachedToWindow ()" , luego maneje esto pensó No puedes hacer esto. Incluso si realmente quieres. Como se indica en la documentación , este método no se llamará si solo ha cambiado la posición del elemento, pero no su contenido, por lo que corremos el riesgo de obtener una posición incorrecta en nuestro oyente. Use getAdapterPosition .


Condición número dos


RecyclerView es una cosa bastante complicada. No hay necesidad de complicarte la vida aún más. Si no está involucrado en la optimización del rendimiento, no debería importarle si este elemento está en el grupo general o no.


Resultado


En estas dos condiciones, es poco probable que necesite reinventar la rueda en forma de una bandera viewWasRecycled .


Que esta pasando


¿Qué le puede pasar a un elemento en RecyclerView en general? Primero, tenga en cuenta que hay 2 "repositorios": caché y grupo. Un elemento ingresa a la memoria caché si ha superado los límites de la pantalla, pero puede regresar nuevamente en cualquier momento, sin siquiera volver a vincular este elemento (es decir, no se onBindViewHolder método onBindViewHolder ). Si el caché está lleno, o por alguna otra razón, RecyclerView decidió que no necesitamos este elemento en un futuro próximo, irá al grupo (aquí se onViewRecycled a onViewRecycled ). El elemento recuperado del grupo se volverá a vincular (porque lo más probable es que su posición haya cambiado), y recibiremos una llamada onBindViewHolder . Pero si el elemento ha abandonado el grupo, el nuevo elemento pasará por todo el ciclo: onCreateViewHolder , onBindViewHolder , onViewAttachedToWindow .


Total, tenemos 3 opciones para el desarrollo de eventos:


  • antes no había ningún elemento: creamos, adjuntamos, adjuntamos;
  • el artículo estaba en el grupo: atar, adjuntar;
  • el elemento estaba en el caché: solo adjunte.

Donde y como


¿Qué y en qué etapas es mejor hacer con un elemento?


  • onCreateViewHolder . Crear, hmm, ViewHolder . No es necesario vincular a un oyente, llenarlo con contenido, etc. Simplemente determine qué tipo necesitamos y créelo.
  • onBindViewHolder . Realizamos el enlace de contenido real: texto, imágenes. El parámetro de position solo puede usarse en el método en sí mismo: no lo guardamos, no lo enviamos a los cierres, recuerde que este método se volverá a llamar si los datos han cambiado (y no se hará si solo la posición ha cambiado). Tampoco colgaría un oyente aquí, por razones de simetría.
  • onViewAttachedToWindow . El elemento ahora estará visible en la pantalla, el usuario podrá interactuar con él, un buen momento para adjuntar un oyente. Recuerde que si necesitamos la posición de un elemento dentro de él, lo obtenemos a través de getAdapterPosition .
  • onViewDetachedFromWindow . El elemento no se mostrará en la pantalla. El usuario no podrá interactuar con él. Eliminar al oyente.
  • onViewRecycled . El artículo se envía a el infierno piscina Aquí puede liberar recursos pesados ​​(imágenes en caché, por ejemplo). Si el elemento se reutilizará, lo más probable es que sea para una posición diferente.

Eso parece ser todo. Espero no haber olvidado nada ni mezclar nada, pero en todo caso, meter la nariz, no seas tímido.

Source: https://habr.com/ru/post/es430812/


All Articles