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. Use el widget RecyclerView cuando tenga colecciones de datos cuyos elementos cambien en tiempo de ejecución en función de la acción del usuario o los eventos de red
En realidad, ListView
puede hacer todo lo anterior si la eficiencia no importa, y hemos encontrado muchos problemas cuando usamos RecyclerView
para reemplazar ListView
:
No hay onItemClickListener () para la selección de elementos de la lista - solución
Sin divisor entre elementos de la lista: solución
Sin selector de superposición incorporado, no hay comentarios visuales cuando hace clic en el elemento de la lista - solución
No addHeaderView para el encabezado de la lista - solución
Quizás más problemas ...
Entonces, cuando usamos RecyclerView
para reemplazar ListView
, tenemos que hacer mucha codificación adicional para alcanzar el mismo efecto que ListView
.
PREGUNTA:
- ¿Vale la pena reemplazarlo
ListView
porRecyclerView
completo?- si no, en cuyo caso debemos utilizar mejor
RecyclerView
lugarListView
, y viceversa?
fuente
Respuestas:
Si ListView funciona para usted, no hay razón para migrar. Si está escribiendo una nueva interfaz de usuario, podría estar mejor con RecyclerView.
RecyclerView es potente cuando necesita personalizar su lista o desea mejores animaciones. Esos métodos de conveniencia en ListView causaron muchos problemas a las personas, por eso RecyclerView les ofrece una solución más flexible.
El cambio principal que necesita hacer para la migración está en su adaptador. Si desea seguir llamando
notifyDataSetChanged
, pierde 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 rendimiento. Estos eventos le permiten a RecyclerView elegir animaciones correctas y también lo ayuda a evitaronBind
llamadas innecesarias . Obtendrá un gran beneficio si las vistas de sus elementos son complejas. Además, en el futuro, habrá más componentes alrededor de RecyclerView.fuente
notifyDataSetChanged()
método me hacíaRecyclerView
seguir pidiendo nuevosViewHolders
todo el tiempo, destripando los beneficios delViewHolder
patrón. Buscando la solución, encontré tu comentario que responde a mi problema de pasada: D ¡gracias!isRecyclable(false);
y el resultado final es RecyclerView muy lento. Ni siquiera puedo cambiar esto, llevará mucho tiempo volver a la vista de lista :(findViewById()
es mucho más costoso que hacerlo de laViewHolder
manera.Según yo, si ListView satisface 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 otorga un gran poder a sus desarrolladores a costa de aumentar la complejidad para los desarrolladores. Hay ciertas cosas que podrían hacerse fácilmente en un ListView ahora puede requerir un esfuerzo innecesario.
Pero sí, hay muchas cosas que un ListView nunca puede hacer, como la sorprendente función LayoutManager que le permite cambiar dinámicamente el diseño a horizontal, vertical, cuadrícula o cuadrícula escalonada sin problemas.
Escribí una respuesta detallada sobre este tema aquí .
fuente
1 Puede usar una interfaz para proporcionar un escucha de clics. Yo 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 dele 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 sí , es una buena idea reemplazar un ListView con un RecyclerView.
fuente
Hasta hace poco seguía 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 crear un ListView simple con menos código es mejor si el rendimiento es irrelevante. A menudo pienso en un profesor en la universidad al que le gustaba decir: "Mi maestro, el gran Niclaus Wirth, el inventor de Pascal, solía decir que si un programa tiene más de 50 líneas de código, seguramente estará equivocado ..."
Pero lo que me ha convencido de dejar de usar ListView es que recientemente se ha movido a la categoría "Legado" en la herramienta de diseño de Android Studio junto con RelativeLayout.
Creo que esta es una forma 'blanda' de 'desaprobación'. Sería demasiado perjudicial si en realidad fuera desaprobado y todos los desarrolladores conscientes 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 eficaz para mostrar listas, use RecyclerView".
https://developer.android.com/reference/android/widget/ListView
Además, la guía de ListView sigue hablando de cargadores de cursor, pero getSupportCursorLoader () en sí mismo ha quedado en desuso en la API 28.
https://developer.android.com/guide/topics/ui/layout/listview
Mejoras recientes a Android Studio:
Esto nos da un RecylerView completamente funcional, poblado con texto básico. Eso elimina mi última razón real para usar ListView porque ahora es tan fácil configurar un RecylerView básico.
En resumen, no tengo la intención de usar ListView en absoluto para un nuevo desarrollo porque etiquetarlo tiene 'legado' está a un paso de despreciarlo.
fuente
El único caso cuando todavía está bien usar ListView es cuando la lista no es dinámica ni 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 estén estrechamente acopladas en ListView, como cambiar la posición / reorganización, animación (de hecho, viene con RecyclerView.ItemAnimator), diseños personalizados (el stock tiene StaggeredGrid además de la lista anterior o el estilo de cuadrícula, pero también existe esta biblioteca que la extiende aún más).
Además, si desea usar CardView, creo que es el único camino a seguir (algunas buenas lecturas sobre cuándo usar la tarjeta o la lista).
fuente
Una gran alternativa es usar BaseAdapter. Es compatible con el uso del patrón Viewholder y el mío contiene más de 100 filas con mapas de bits y botones y funciona muy bien.
fuente