Recientemente me encontré con el Android RecyclerView
que se lanzó con Android 5.0 y parece que RecyclerView
es solo un tradicional encapsulado ListView
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 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.
android
performance
listview
android-recyclerview
Mushtaq Jameel
fuente
fuente
RecyclerView
es 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 implementanRecyclerView
sin que tenga que hacer nada. No hay duda al respecto, tira tuListView
basura a la basura,RecyclerView
está aquí para robar el espectáculo.Respuestas:
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.
fuente
La otra ventaja de usar
RecycleView
es la animación, se puede hacer en dos líneas de código.Pero el widget sigue sin procesar, por ejemplo, no puede crear encabezado y pie de página .
fuente
HeaderViewListAdapter
y agrega soporte de encabezado en segundo plano. ConRecyclerView
usted eres el que tiene el control.Bien, un poco de excavación y encontré estas gemas del artículo de Bill Philips sobre
RecycleView
fuente
Más del artículo de Bill Phillip (¡ve a leerlo!), Pero pensé que era importante señalar lo siguiente.
fuente
Utilicé un
ListView
cargador de imágenes con Glide, que tenía un crecimiento de memoria. Luego reemplacé elListView
con aRecyclerView
. No solo es más difícil en la codificación, sino que también conduce a un mayor uso de memoria que aListView
. 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énTextWatcher
se puede aplicar. Si utilicé aViewHolder
, ¿cómo podría reemplazar aTextWatcher
durante el desplazamiento? Entonces, usé unListView
sin unViewHolder
, y funciona.fuente
TextWatcher
s en una pantalla. Probablemente tengas razón, pero no puedo comprobarlo.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:
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.
fuente
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.
fuente
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:
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.
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.
fuente
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.
fuente