¿Deberíamos usar RecyclerView para reemplazar ListView?

Los documentos de Android dicen:

El widget RecyclerView es una versión más avanzada y flexible de ListView. Este widget es un contenedor para mostrar grandes conjuntos de datos que se pueden desplazar de manera muy eficiente manteniendo un número limitado de vistas. Utilice el widget RecyclerView cuando tenga colecciones de datos cuyos elementos cambien en el tiempo de ejecución en función de la acción del usuario o de los eventos de red

En realidad, ListView puede hacer todo lo anterior si la eficiencia no importa, y hemos encontrado muchos problemas cuando utilizamos RecyclerView para reemplazar ListView :

  1. No hay onItemClickListener () para la selección de elemento de lista – solución

  2. Sin divisor entre los elementos de la lista: solución

  3. Sin selector de superposición incorporado, no hay comentarios visuales al hacer clic en el elemento de la lista: solución

  4. No addHeaderView para el encabezado de la lista – solución

Tal vez más problemas …

Entonces, cuando utilizamos RecyclerView para reemplazar ListView , tenemos que hacer mucha encoding adicional para alcanzar el mismo efecto que ListView .

PREGUNTA:

  • ¿Vale la pena reemplazar completamente ListView con RecyclerView ?
  • si no, ¿en qué caso deberíamos utilizar RecyclerView lugar de ListView , y viceversa?

Si ListView funciona para usted, no hay razón para migrar. Si está escribiendo una nueva interfaz de usuario, es posible que esté mejor con RecyclerView.

RecyclerView es poderoso cuando necesita personalizar su lista o desea mejores animaciones. Esos métodos de conveniencia en ListView causaron muchos problemas a las personas y es por eso que RecyclerView les brinda una solución más flexible.

El cambio principal que necesita realizar para la migración está en su adaptador. Si desea seguir llamando a notifyDataSetChanged , perderá la mayoría de los beneficios de animación y enlace. Pero si puede cambiar su adaptador para enviar eventos de notificación detallados (agregados / eliminados / movidos / actualizados), obtendrá mejores animaciones y mejor rendimiento. Estos eventos le permiten a RecyclerView elegir animaciones correctas y también le ayuda a evitar innecesarias llamadas en línea. Obtendrá un gran beneficio si las vistas de sus elementos son complejas. Además, en el futuro, habrá más componentes alrededor de RecyclerView.

De acuerdo a mí, si ListView cumple con todas las necesidades actuales de su aplicación y satisface todos los casos de uso, entonces no hay necesidad de reemplazarlo con un RecyclerView.

El RecyclerView le da un gran poder a sus desarrolladores a costa de boost la complejidad para los desarrolladores. Hay ciertas cosas que se podrían hacer fácilmente en un ListView ahora pueden tomar un montón de esfuerzo innecesario.

Pero sí, hay muchas cosas que un ListView nunca puede hacer, como la asombrosa característica LayoutManager, que puede permitirle cambiar dinámicamente el diseño a una cuadrícula horizontal, vertical, de cuadrícula o escalonada sin interrupciones.

Escribí una respuesta detallada sobre este tema aquí .

1 Puede usar una interfaz para proporcionar un oyente de clic. También uso esta técnica con ListViews.
2 Sin divisor: simplemente agregue en su fila una Vista con un ancho de match_parent y una altura de 1dp y asígnele un color de fondo .
3 Simplemente use un selector StateList para el fondo de la fila.
4 addHeaderView también se puede evitar en ListViews: simplemente coloque el encabezado fuera de la vista.

Entonces, si la eficiencia es su preocupación, entonces , es una buena idea reemplazar un ListView con un RecyclerView.

El único caso en el que todavía está bien usar ListView es cuando la lista no es dinámica o está afectada por eventos de red. Por ejemplo: navegación.

Para cualquier otro uso, RecyclerView eclipsa ListView. Dado que RecyclerView solo se preocupa por el reciclaje, será más fácil hacer cosas visuales relacionadas que fueron estrechamente acopladas en ListView, como cambiar la posición / reorganización, animación (de hecho, viene con RecyclerView.ItemAnimator), diseños personalizados (el inventario tiene StaggeredGrid además de la lista anterior o el estilo de cuadrícula, pero también existe esta biblioteca que la amplía aún más).

Además, si desea usar CardView, creo que es la única manera de hacerlo (una buena lectura es cuándo usar la tarjeta o la lista).

Una gran alternativa es usar BaseAdapter. Es compatible con el uso del patrón del Visualizador y el mío contiene más de 100 filas con mapas de bits y botones, y funciona muy bien.

Hasta hace poco, todavía estaba usando ListView para listas muy simples. Por ejemplo, si quiero mostrar una lista simple de opciones de texto …

Basé esa decisión en “factores humanos”, que la creación de un ListView simple con menos código es mejor si el rendimiento es inmaterial. A menudo pienso en un profesor de la universidad al que le gustaba decir: “Mi maestro, el gran Niclaus Wirth, el inventor de Pascal, solía decir que si un progtwig tiene más de 50 líneas de código, seguro que está mal …”

Pero lo que me ha convencido de dejar de usar ListView es que recientemente se ha movido a la categoría “Legacy” en la herramienta de diseño de Android Studio junto con RelativeLayout.

https://developer.android.com/reference/android/widget/ListView

Creo que esta es una forma “suave” de “desaprobación”. Sería demasiado perturbador si en realidad estuviera en desuso y todos los desarrolladores concienzudos movieran su código a RecyclerView.

Además, la introducción a ListView advierte en la parte superior que RecyclerView es una mejor opción: “Para un enfoque más moderno, flexible y de rendimiento para mostrar listas, use RecyclerView”.
https://developer.android.com/reference/android/widget/ListView

Además, la guía de ListView todavía está hablando de cargadores de cursor, pero luego getSupportCursorLoader () en sí acaba de ser desaprobado en API 28.
https://developer.android.com/guide/topics/ui/layout/listview

Mejoras recientes a Android Studio:

Archivo -> Nuevo -> Fragmento -> Fragmento (Lista)

Esto nos da un RecylerView totalmente funcional poblado con texto básico. Eso elimina la última razón real para usar ListView porque ahora es tan fácil configurar un RecylerView básico.

En resumen, no pretendo usar ListView para el desarrollo nuevo porque el etiquetado tiene ‘legado’ está a un paso de desaprobarlo.