Android Recyclerview vs ListView con Viewholder

148

Recientemente me encontré con el Android RecyclerViewque se lanzó con Android 5.0 y parece que RecyclerViewes solo un tradicional encapsulado ListViewcon el patrón ViewHolder incorporado, que promueve la reutilización de la vista, en lugar de crearla cada vez.

¿Cuáles son los otros beneficios de usar RecyclerView? Si ambos tienen el mismo efecto en términos de rendimiento, ¿por qué preferiría RecyclerView`?

Editar

Descubrí que las personas han hecho preguntas similares y las respuestas no son concluyentes, y las agregué aquí para mantener registros.

Recyclerview vs Listview

¿Deberíamos usar RecyclerView para reemplazar ListView?

¿Por qué RecyclerView no tiene onItemClickListener ()? y ¿Cómo RecyclerView es diferente de Listview?

Mushtaq Jameel
fuente
44
Porque RecyclerViewes mucho más rápido y más versátil con una API mucho mejor. Cosas como animar la adición o eliminación de elementos ya se implementan RecyclerViewsin que tenga que hacer nada. No hay duda al respecto, tira tu ListViewbasura a la basura, RecyclerViewestá aquí para robar el espectáculo.
Xaver Kapeller
44
Puede asociar un administrador de diseño con un RecyclerView, por lo que no se limitan a las listas de desplazamiento vertical. Esta es una funcionalidad adicional bastante poderosa.
Alan
@Alan - ¿Qué quieres decir con "no limitado a listas de desplazamiento vertical"? ¿Está diciendo que la Vista de reciclaje también puede actuar como un "marcador de posición" para Gridviews y ListViews?
Mushtaq Jameel
@XaverKapeller: sería genial si pudieras enumerar las diferencias entre los dos y responder la pregunta en lugar de un comentario, para que pueda ayudarnos a mí y a los demás en el futuro, ¿quién se preguntará sobre lo mismo?
Mushtaq Jameel
@ Alan - ¿Podría proporcionar un poco de detalle sobre lo que quiso decir y responder la pregunta en lugar de un comentario? Gracias por tomarse el tiempo
Mushtaq Jameel

Respuestas:

289

Con la llegada de Android Lollipop, el RecyclerView se abrió camino oficialmente. RecyclerView es mucho más potente, flexible y una mejora importante sobre ListView . Trataré de darle una visión detallada de ello.

1) Patrón ViewHolder

En ListView, se recomienda usar el patrón ViewHolder, pero nunca fue una compulsión. En el caso de RecyclerView, esto es obligatorio utilizando la clase RecyclerView.ViewHolder . Esta es una de las principales diferencias entre ListView y RecyclerView.

Hace las cosas un poco más complejas en RecyclerView, pero muchos de los problemas que enfrentamos en ListView se resuelven de manera eficiente.

2) LayoutManager

Esta es otra mejora masiva traída a RecyclerView. En un ListView, el único tipo de vista disponible es el ListView vertical. No hay forma oficial de implementar un ListView horizontal.

Ahora usando un RecyclerView, podemos tener un

i) LinearLayoutManager : que admite listas verticales y horizontales,

ii) StaggeredLayoutManager , que admite Pinterest como listas escalonadas,

iii) GridLayoutManager : que admite la visualización de cuadrículas como se ve en las aplicaciones de la Galería.

Y lo mejor es que podemos hacer todo esto dinámicamente como queramos.

3) Animador de artículos

ListViews carece de soporte para buenas animaciones, pero RecyclerView aporta una dimensión completamente nueva. Usando la clase RecyclerView.ItemAnimator , animar las vistas se vuelve mucho más fácil e intuitivo.

4) Decoración del artículo

En el caso de ListViews, decorar dinámicamente elementos como agregar bordes o divisores nunca fue fácil. Pero en el caso de RecyclerView, la clase RecyclerView.ItemDecorator brinda un gran control a los desarrolladores pero hace que las cosas sean un poco más largas y complejas.

5) OnItemTouchListener

La intercepción de clics de elementos en ListView fue simple, gracias a su interfaz AdapterView.OnItemClickListener . Pero RecyclerView brinda mucho más poder y control a sus desarrolladores mediante RecyclerView.OnItemTouchListener ( ya no es compatible, consulte AndroidX ), pero complica un poco las cosas para el desarrollador.

En palabras simples, RecyclerView es mucho más personalizable que ListView y brinda mucho control y poder a sus desarrolladores.

Aritra Roy
fuente
34
Buena respuesta. Un par de grandes ventajas adicionales: RecyclerView prepara la vista justo delante y detrás de las entradas visibles, lo cual es genial si está buscando mapas de bits en segundo plano. El rendimiento es dramáticamente más rápido, especialmente si usa RecyclerView.setHasFixedSize. El antiguo ListView se basa en la premisa de que no hay forma de calcular previamente o almacenar en caché el tamaño de las entradas en la lista, lo que causa complicaciones insanas al desplazarse y realizar el diseño. Toma un tiempo acostumbrarse, pero una vez que lo hagas, nunca volverás.
Robin Davies
@RobinDavies Excelente punto. Gracias por informarme. Pero no tendrá sentido si los tamaños de los artículos son diferentes.
Aritra Roy
@AritraRoy Recyclerview admite solo lollipop o api 14+ (android 4+) también .... mientras leo "after lollipop: en la mayoría de los lugares
Animesh Mangla
2
Hola, Aritra. Al comparar con ListView, si ListView también usa ViewHolder Pattern, ¿cuál actúa de manera más eficiente? Will RecylerView mejor, cuando se utiliza fps u otro criterio similar? thx ~
RxRead
@RxRead: Vea el comentario de Robin, él diferencia RecyclerView Vs ListView con un patrón de soporte de vista en función del rendimiento.
Parag Kadam
10

La otra ventaja de usar RecycleViewes la animación, se puede hacer en dos líneas de código.

RecyclerView.ItemAnimator itemAnimator = new DefaultItemAnimator();
        recyclerView.setItemAnimator(itemAnimator);

Pero el widget sigue sin procesar, por ejemplo, no puede crear encabezado y pie de página .

Etun
fuente
55
Y nunca podrá crear encabezado y pie de página en ese sentido. Son solo otros tipos de vista en su adaptador. La vista de lista envuelve su adaptador HeaderViewListAdaptery agrega soporte de encabezado en segundo plano. Con RecyclerViewusted eres el que tiene el control.
Eugen Pechanec
RecyclerView utiliza un DefaultItemAnimator por defecto. Entonces, ¿por qué usaste este código?
Athira Reddy el
9

Bien, un poco de excavación y encontré estas gemas del artículo de Bill Philips sobreRecycleView

RecyclerView puede hacer más que ListView, pero la clase RecyclerView tiene menos responsabilidades que ListView. Fuera de la caja, RecyclerView no:

  • Posicionar elementos en la pantalla
  • Vistas animadas
  • Maneja cualquier evento táctil aparte del desplazamiento

Todo esto se incluyó en ListView, pero RecyclerView utiliza clases de colaboradores para realizar estos trabajos.

Los ViewHolders que creas también son más robustos. Subclase RecyclerView.ViewHolder, que tiene un montón de RecyclerView usos de métodos . ViewHolderssepa a qué posición están vinculados actualmente, así como a qué identificadores de elemento (si los tiene). En el proceso, ViewHolder ha sido nombrado caballero. Solía ​​ser el trabajo de ListView retener toda la vista del elemento, y ViewHoldersolo retenía pequeños fragmentos.

Ahora, ViewHolder se aferra a todo en el ViewHolder.itemView campo, que está asignado en el constructor de ViewHolder para usted.

Mushtaq Jameel
fuente
4

Más del artículo de Bill Phillip (¡ve a leerlo!), Pero pensé que era importante señalar lo siguiente.

En ListView, había cierta ambigüedad sobre cómo manejar los eventos de clic: ¿Las vistas individuales deberían manejar esos eventos, o la Lista debería manejarlos a través de OnItemClickListener? Sin embargo, en RecyclerView, ViewHolder está en una posición clara para actuar como un objeto controlador de nivel de fila que maneja ese tipo de detalles.

Vimos anteriormente que LayoutManager manejaba las vistas de posicionamiento, y ItemAnimator manejaba animarlas. ViewHolder es la última pieza: es responsable de manejar cualquier evento que ocurra en un elemento específico que muestra RecyclerView.

Jaison Brooks
fuente
2

Utilicé un ListViewcargador de imágenes con Glide, que tenía un crecimiento de memoria. Luego reemplacé el ListViewcon a RecyclerView. No solo es más difícil en la codificación, sino que también conduce a un mayor uso de memoria que a ListView. Al menos, en mi proyecto.

En otra actividad usé una lista compleja con EditText's. En algunos de ellos, un método de entrada puede variar, también TextWatcherse puede aplicar. Si utilicé a ViewHolder, ¿cómo podría reemplazar a TextWatcherdurante el desplazamiento? Entonces, usé un ListViewsin un ViewHolder, y funciona.

CoolMind
fuente
Usé un ListView sin ViewHolder, y funciona. idea terrible ... ¿cómo podría reemplazar un TextWatcher durante el desplazamiento? no hay necesidad de reemplazarlo ... solo TextWacher debería poner los datos en un contenedor diferente después de reutilizarlos ... y se puede hacer realmente fácil
Selvin
@Selvin, gracias por tu opinión. Ahora no puedo editar ese proyecto. Había varios TextWatchers en una pantalla. Probablemente tengas razón, pero no puedo comprobarlo.
CoolMind
1

Reutiliza las celdas mientras se desplaza hacia arriba / abajo : esto es posible con la implementación de View Holder en el adaptador listView, pero era algo opcional, mientras que en RecycleView es la forma predeterminada de escribir el adaptador.

Desacopla la lista de su contenedor , para que pueda colocar elementos de la lista fácilmente en tiempo de ejecución en los diferentes contenedores (linearLayout, gridLayout) con la configuración de LayoutManager.

Ejemplo:

mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
//or
mRecyclerView.setLayoutManager(new GridLayoutManager(this, 2));
mRecyclerView.setLayoutManager(new GridLayoutManager(this, 3));
  • Anima acciones de lista común.

  • Las animaciones se desacoplan y se delegan en ItemAnimator.

Hay más información sobre RecyclerView, pero creo que estos puntos son los principales.

LayoutManager

i) LinearLayoutManager: que admite listas verticales y horizontales,

ii) StaggeredLayoutManager, que admite Pinterest como listas escalonadas,

iii) GridLayoutManager: que admite la visualización de cuadrículas como se ve en las aplicaciones de la Galería.

Y lo mejor es que podemos hacer todo esto dinámicamente como queramos.

Keshav Gera
fuente
1

1. Ver titulares

En ListView, la definición de los titulares de vistas era un enfoque sugerido para mantener referencias para las vistas. Pero no fue una compulsión. Aunque al no hacerlo, ListView utilizó mostrar datos obsoletos. Otro inconveniente importante de no usar titulares de vistas podría llevar a una operación pesada de encontrar vistas por identificadores cada vez. Lo que resultó en ListViews laggy.

Este problema se resuelve en RecylerView mediante el uso de la clase RecyclerView.ViewHolder. Esta es una de las principales diferencias en RecyclerView y ListView. Al implementar un RecyclerView, esta clase se utiliza para definir un objeto ViewHolder que el adaptador usa para unir ViewHolder con una posición. Otro punto a tener en cuenta aquí es que, al implementar el adaptador para RecyclerView, es obligatorio proporcionar un ViewHolder. Esto hace que la implementación sea un poco compleja, pero resuelve los problemas que enfrenta ListView.

2. Layout Manager

Cuando se habla de ListViews, solo hay un tipo de ListView disponible, es decir, el ListView vertical. No puede implementar un ListView con desplazamiento horizontal. Sé que hay formas de implementar un desplazamiento horizontal, pero créanme que no fue diseñado para funcionar de esa manera.

Pero ahora, cuando miramos Android RecyclerView vs ListView, también tenemos soporte para colecciones horizontales. De hecho, es compatible con múltiples tipos de listas. Para admitir múltiples tipos de listas, utiliza la clase RecyclerView.LayoutManager. Esto es algo nuevo que ListView no tiene. RecyclerView admite tres tipos de gestores de diseño predefinidos:

LinearLayoutManager: este es el administrador de diseño más utilizado en el caso de RecyclerView. A través de esto, podemos crear listas de desplazamiento horizontal y vertical. StaggeredGridLayoutManager: a través de este administrador de diseño, podemos crear listas escalonadas. Al igual que la pantalla de Pinterest. GridLayoutManager: este administrador de diseño se puede utilizar para mostrar cuadrículas, como cualquier galería de imágenes.

3. Animador de elementos

Las animaciones en una lista son una dimensión completamente nueva, que tiene infinitas posibilidades. En un ListView, como tal, no hay disposiciones especiales a través de las cuales se pueda animar, agregar o eliminar elementos. Más tarde, a medida que Android evolucionaba, ViewPropertyAnimator fue sugerido por Chet Haase de Google en este video tutorial para animaciones en ListView.

Por otro lado, al comparar Android RecyclerView con ListView, tiene la clase RecyclerView.ItemAnimator para manejar animaciones. A través de esta clase, se pueden definir animaciones personalizadas para agregar elementos, eliminar y mover eventos. También proporciona un DefaultItemAnimator, en caso de que no necesite ninguna personalización.

4. Adaptador

Los adaptadores ListView fueron fáciles de implementar. Tenían un método principal getView donde solía ocurrir toda la magia. Donde las vistas estaban vinculadas a una posición. También solían tener un método interesante registerDataSetObserver donde se puede establecer un observador directamente en el adaptador. Esta característica también está presente en RecyclerView, pero se utiliza la clase RecyclerView.AdapterDataObserver. Pero el punto a favor de ListView es que admite tres implementaciones predeterminadas de adaptadores:

ArrayAdapter CursorAdapter SimpleCursorAdapter Mientras que el adaptador RecyclerView tiene todas las funcionalidades que tenían los adaptadores ListView, excepto el soporte incorporado para cursores DB y ArrayLists. En RecyclerView.Adapter a partir de ahora tenemos que hacer una implementación personalizada para suministrar datos al adaptador. Al igual que lo hace un BaseAdapter para ListViews. Aunque si desea obtener más información sobre la implementación del adaptador RecyclerView, consulte el ejemplo de Android RecyclerView.

5. Notificación de cambio en los datos

Al trabajar con un ListView, si se cambia el conjunto de datos, debe llamar al método notifyDataSetChanged del adaptador subyacente para actualizar los datos. O establezca el método setNotifyOnChange en verdadero en caso de que desee llamar al método notifyDataSetChanged automáticamente. Pero en ambos casos, el resultado es muy pesado en la lista. Básicamente actualiza las vistas de la lista.

Pero, por el contrario, en un adaptador RecyclerView, si un solo elemento o una variedad de elementos han cambiado, existen métodos para notificar el cambio en consecuencia. Esos son notifyItemChanged y notifyItemRangeChanged respectivamente y muchos más como:

notifyItemInsterted notifyItemMoved notifyItemRangeInsterted notifyItemRangeRemoved Y, por supuesto, tiene el método original para actualizar toda la lista, es decir, notifyDataSetChanged que notifica la adaptación de todo el conjunto de datos ha cambiado.

6. Decoración del artículo

Para mostrar divisores personalizados en un ListView, uno podría haber agregado fácilmente estos parámetros en el XML de ListView:

XHTML android: divider = "@ android: color / transparent" android: dividerHeight = "5dp" 1 2 android: divider = "@ android: color / transparent" android: dividerHeight = "5dp" La parte interesante de Android RecyclerView es que, a partir de ahora no muestra un divisor entre elementos de forma predeterminada. Aunque los chicos de Google deben haber dejado esto fuera para la personalización, intencionalmente. Pero esto aumenta enormemente el esfuerzo para un desarrollador. Si desea agregar un divisor entre elementos, es posible que deba realizar una implementación personalizada utilizando la clase RecyclerView.ItemDecoration.

O puede aplicar un hack usando este archivo de muestras oficiales: DividerItemDecoration.java

7. OnItemTouchListener

Las vistas de lista solían tener una implementación simple para la detección de clics, es decir, mediante el uso de la interfaz AdapterView.OnItemClickListener.

Pero, por otro lado, la interfaz RecyclerView.OnItemTouchListener se utiliza para detectar eventos táctiles en Android RecyclerView. Complica un poco la implementación, pero le da un mayor control al desarrollador para interceptar eventos táctiles. La documentación oficial indica que puede ser útil para manipulaciones gestuales, ya que intercepta un evento táctil antes de que se entregue a RecyclerView.

Raviraj
fuente
1

RecyclerView se creó como una mejora de ListView, así que sí, puede crear una lista adjunta con el control ListView, pero usar RecyclerView es más fácil ya que:

  1. Reutiliza las celdas mientras se desplaza hacia arriba / abajo : esto es posible con la implementación de View Holder en el adaptador ListView, pero era algo opcional, mientras que en RecycleView es la forma predeterminada de escribir el adaptador.

  2. Desacopla la lista de su contenedor : para que pueda colocar elementos de la lista fácilmente en tiempo de ejecución en los diferentes contenedores (linearLayout, gridLayout) con la configuración de LayoutManager.

mRecyclerView = (RecyclerView) findViewById (R.id.my_recycler_view); mRecyclerView.setLayoutManager (nuevo LinearLayoutManager (este)); mRecyclerView.setLayoutManager (nuevo GridLayoutManager (este, 2));

  1. Anima acciones de lista común : las animaciones se desacoplan y se delegan en ItemAnimator. Hay más información sobre RecyclerView, pero creo que estos puntos son los principales.

Por lo tanto, para concluir, RecyclerView es un control más flexible para manejar "datos de lista" que sigue patrones de delegación de preocupaciones y deja para sí solo una tarea: reciclar elementos.

farzin borujerdi
fuente
0

Si usa RecycleView, primero necesita más esfuerzo para configurar. Necesita dar más tiempo para configurar un elemento simple en clic, borde, evento táctil y otras cosas simples. Pero el producto final será perfecto.

Entonces la decisión es tuya. Sugiero que, si diseña una aplicación simple como la carga de la agenda telefónica, donde un simple clic en el elemento es suficiente, puede implementar la vista de lista. Pero si diseñas como página de inicio de redes sociales con desplazamiento ilimitado. Varias decoraciones diferentes entre elementos, mucho control de cada elemento que el uso de la vista de reciclaje.

Mahbubur Rahman Khan
fuente