¿Deberíamos usar RecyclerView para reemplazar ListView?

232

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, ListViewpuede hacer todo lo anterior si la eficiencia no importa, y hemos encontrado muchos problemas cuando usamos RecyclerViewpara reemplazar ListView:

  1. No hay onItemClickListener () para la selección de elementos de la lista - solución

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

  3. Sin selector de superposición incorporado, no hay comentarios visuales cuando hace clic en el elemento de la lista - solución

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

Quizás más problemas ...

Entonces, cuando usamos RecyclerViewpara reemplazar ListView, tenemos que hacer mucha codificación adicional para alcanzar el mismo efecto que ListView.

PREGUNTA:

  • ¿Vale la pena reemplazarlo ListViewpor RecyclerViewcompleto?
  • si no, en cuyo caso debemos utilizar mejor RecyclerViewlugar ListView, y viceversa?
Xcihnegn
fuente
99
su hilo es solo el primer problema, y ​​no es mi pregunta
Xcihnegn
3
Solo mencione que debe usar una vista de reciclador si está interesado en usar una barra de acción contraída. medium.com/android-bites/…
francas
debe usar la vista de reciclaje porque ofrece más control que la vista de lista. Es un poco complejo pero llegas allí, entonces tu vida será súper fácil siempre que estés lidiando con una lista de cosas.
Sadashiv
3
mejor es enemigo del bien.
oldgod

Respuestas:

118

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 evitar onBindllamadas 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.

yigit
fuente
2
Si pudiera darte 100 votos a favor, lo haría. El notifyDataSetChanged()método me hacía RecyclerViewseguir pidiendo nuevos ViewHolderstodo el tiempo, destripando los beneficios del ViewHolderpatrón. Buscando la solución, encontré tu comentario que responde a mi problema de pasada: D ¡gracias!
Aspirante a Dev
No estoy de acuerdo "Obtendrá un gran beneficio si las vistas de su artículo son complejas", tengo recyclerView en el que el adaptador tiene 3, de lo contrario, Recyclerview funciona mal en mi caso. Tuve que desactivar el reciclaje usando isRecyclable(false);y el resultado final es RecyclerView muy lento. Ni siquiera puedo cambiar esto, llevará mucho tiempo volver a la vista de lista :(
kashyap jimuliya
44
la gente usa RV con muchos más tipos que sin ningún problema y buen rendimiento. Hay algo más mal en su código. Debería usar systrace / traceview y ver qué sucede.
yigit
1
@kashyapjimuliya como mencionó yigit , 3 si no debería causar eso. En primer lugar, no mencionaste dónde pusiste estos if-else; en segundo lugar, deshabilitar el reciclaje debería hacerlo más lento, no más rápido. ¿Por qué? Porque inflar una vista y hacerlo findViewById()es mucho más costoso que hacerlo de la ViewHoldermanera.
Sufian
24

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í .

Aritra Roy
fuente
3
Claro, RecyclerView aumenta la complejidad, pero al menos implementa el patrón ViewHolder correctamente para usted.
IgorGanapolsky
@IgorGanapolsky +1 para la implementación del patrón ViewHolder.
Sreekanth Karumanaghat
puede escribir su propio patrón de soporte de vista muy bien con un ListView
dan
9

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 , es una buena idea reemplazar un ListView con un RecyclerView.

Phantômaxx
fuente
19
Estas no son mis preguntas, he tenido un enlace para cada solución de problema
Xcihnegn
6

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.

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

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:

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

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.

Elletlar
fuente
3

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).

inmyth
fuente
¿Se refiere a tomar una lista de datos de los servidores, luego almacenados en el sqlite en el teléfono para usarlos en una pantalla de lista (digamos sus seguidores) es mejor usar una vista de reciclador que una vista de lista con un titular de vista ?
Lion789
Si. Pero para ser precisos, ya no veo ningún rol para ListView, excepto la navegación, y eso es porque creo que es excesivo usar RecyclerView allí.
inmyth
2

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.

grantespo
fuente