Android Recyclerview vs ListView con Viewholder

Recientemente me encontré con el android RecycleView que se lanzó con Android 5.0 y parece que RecycleView es simplemente un ListView tradicional encapsulado con 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 RecycleView ? Si ambos tienen el mismo efecto en términos de rendimiento, ¿por qué uno elegiría usar RecycleView`?

Editar

Descubrí que las personas hicieron preguntas similares y las respuestas no son concluyentes, y las agregué aquí para llevar un registro.

Recyclerview vs Listview

¿Deberíamos usar RecyclerView para reemplazar ListView?

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

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

1) Patrón de ViewHolder

En un ListView, se recomendó 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 el ListView se resuelven de manera eficiente.

2) LayoutManager

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

Ahora usando un RecyclerView, podemos tener un

i) LinearLayoutManager : compatible con listas verticales y horizontales.

ii) StaggeredLayoutManager – que soporta Pinterest como listas escalonadas,

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

Y lo mejor es que podemos hacer todo esto de forma dinámica como queramos.

3) Animador de artículos

Las ListViews carecen de buenas animaciones, pero RecyclerView le 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, la decoración dinámica de elementos como la adición de bordes o separadores nunca fue fácil. Pero en el caso de RecyclerView, la clase RecyclerView.ItemDecorator otorga un gran control a los desarrolladores, pero hace que las cosas sean un poco más complejas y que consumn más tiempo.

5) OnItemTouchListener

La interceptación de clics de elementos en un ListView fue simple, gracias a su interfaz AdapterView.OnItemClickListener . Pero el RecyclerView le da mucha más potencia y control a sus desarrolladores gracias a RecyclerView.OnItemTouchListener, pero complica un poco las cosas para el desarrollador.

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

Bien, tan poco excavando y encontré estas gems del artículo de Bill Philips sobre RecycleView

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
  • Manejar cualquier evento táctil aparte del desplazamiento

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

Los ViewHolders que creas son más sólidos también. Subclase RecyclerView.ViewHolder , que tiene varios métodos que usa RecyclerView . ViewHolders saben a qué posición están actualmente vinculados, así como también los ID de los ítems (si los tiene). En el proceso, ViewHolder ha sido nombrado caballero. Solía ​​ser el trabajo de ListView para conservar toda la vista de elementos, y ViewHolder solo se ViewHolder a pequeños fragmentos.

Ahora, ViewHolder se aferra a todo esto en el campo ViewHolder.itemView , que se asigna en el constructor de ViewHolder por usted.

La otra ventaja del uso de RecycleView es la animación, se puede hacer en dos líneas de código

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

Pero el widget todavía está en bruto, por ejemplo, no puede crear encabezado y pie de página .

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

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

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

Utilicé un cargador de imágenes ListView con Glide, con crecimiento de memoria. Luego reemplacé el ListView con un RecyclerView . No solo es más difícil en la encoding, sino que también lleva a un uso de memoria mayor que un 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 se puede aplicar un TextWatcher . Si utilicé ViewHolder , ¿cómo podría reemplazar un TextWatcher durante el desplazamiento? Entonces, utilicé ListView sin ViewHolder , y funciona.