Rescue Sanity View en RecyclerView! | según Pooj Srivastav Octubre de 2020

Durante el desarrollo, nos encontramos con varios desafíos que requieren la visualización de una gran cantidad de conjuntos de datos que se pueden mover de manera muy eficiente sin el riesgo de que los costos de rendimiento estén donde RecyclerView entra en escena.

Versión avanzada y flexible de ListView que admite Memory Management de acuerdo a recycling view porque usa ViewHolder, que lanza un hechizo mientras reduce ViewCreation manteniéndolo MainThread lejos de la tarea intensiva de CPU, mejorando así performance.

Pero porque recicla el artículocon«Las vistas que tienen un comportamiento alternativo (casilla de verificación, conmutador conmutador, etc.) eventualmente pierden su estado actual (seleccionado por el usuario) cuando se desplazan, lo que genera un comportamiento impredecible dentro de RecyclerView.

Para mantener intacto el sentido común, alguien podría verse obligado a usar una estructura de datos (como HashMap, SparseBooleanArray, etc.), y ahí es donde comienza a correr mi paciencia.

Hemos recorrido un largo camino, así que les mostraré cómo mantuve el estado actual de la casilla de verificación con data classes en Kotlin:

  1. Primero, creemos una clase de datos para almacenar datos.
data class ListItem(val checkboxTextValue: String, val checkboxPreviousState: Boolean, var checkboxCurrentState: Boolean = checkboxPreviousState)
  • checkboxPreviousState: sosteniendo el estado checkbox antes de la interacción del usuario, val propiedad (variable lógica de solo lectura)
  • checkboxCurrentState: sosteniendo el estado checkbox después de la interacción del usuario
    – un var propiedad (puedes mutar el estado)
    – inicialización predeterminada con checkboxPreviousState

2. La clase Adaptador se ve así:

3. La clase ViewHolder se ve así:

Pero la brecha aún persiste en la clase ViewHolder, que es:
ViewHolder significa que setOnCheckedChangeListener se inicia cuando haces clic en una casilla de verificación, pero de hecho, se dispara en un momento inesperado.

El ViewHolder que se asoció previamente con la casilla marcada / desmarcada será recycled y entonces re-used para mostrar otra vista que se puede marcar / desmarcar. En ese momento onBindViewHolder será llamado, que comenzará

item_checkbox.isChecked =  textListItem.checkboxCurrentState

y terminé corriendo setOnCheckedChangeListener en cada elemento a medida que se desplaza hacia abajo en la lista, lo que da como resultado cambios en el estado de las vistas que también se verificaron anteriormente.

Para corregir la situación, necesitamos configurar los oyentes para cambiar el estado de la casilla de verificación null como lo primero para evitar el inicio predeterminado setOnCheckedChangeListener dentro onBindViewHolder().

Sin embargo, tenemos varias otras opciones para eliminar el escenario: una es llamar al oyente a hacer clic y checkbox en lugar de escuchar eventos de setOnCheckedChangeListener.

setOnClickListener dispara un evento, solo cuando checkbox Yippee clickeddiferente a setOnCheckedChangeListener que dispara el evento cada vez checkbox el estado muta.

Pasar a la siguiente opción que tenemos en la placa es configurar el oyente dentro del bloque de inicio, que es otra opción útil para decidir, pero este enfoque tiene sus propios defectos. caches mostrar enlaces que resultan ser la razón principal de las pérdidas de memoria de Android.

Los enlaces a la vista anterior no se borrarán incluso después de actualizar los datos.

Enfoque 4:

El siguiente paso es liberar los recursos tan pronto como la vista esté fuera de la ventana. onViewDetachedFromWIndow.

onViewDetachedFromWindow(VH holder) el emparejamiento siempre sigue onViewAttachedToWindow(VH holder). Se llama exactamente cuando el titular de la vista es visible o invisible (conectar o desconectar llamadas).

Si viewHolder ha sido desconectado pero aún no reciclado, es posible que lo acepte onViewAttachedToWindow(ViewHolder) llamar de nuevo sin tener que volver a enlazar los datos usando onBindViewHolder.

¡Si tambien! Puede liberar recursos en un archivo en cualquier momento onViewRecycled(VH holder) un método que se llama justo antes de que los datos internos de ViewHolder se eliminen y se envíen a RecycledViewPool lo que le brinda la ventaja de las memorias de memoria al descartar datos de la caché de recursos consumidos.

Esto es muy recomendable: si la vista del elemento tiene un enlace de datos grande o caro, como mapas de bits grandes, este puede ser un buen lugar para liberar estos recursos.

Con estas soluciones, eliminé posibles agujeros que pudieran ocurrir por la aplicación del dolor. Me encontré con el mismo escenario que me llevó a proponer estas soluciones, aunque la puerta siempre está abierta para explorar otros.

Para una vista tan simple, preferiría usar uno de los enfoques anteriores, pero el cuarto sería una solución confiable incluso en el caso de vistas complejas.

Espero que leer para ti sea tan útil como escribir para mí. Se ha añadido un enlace al proyecto a continuación.
Este es mi primer artículo técnico sobre el medio después de que me motivara un colega que, afortunadamente, es bueno codificando. Chetan Garg me ayudó durante mis hallazgos, y si quieres sumergirte profundamente en la Cuenca, lee sus articulos.

Mantente seguro … ¡Disfruta de la vida y sigue codificando!

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *