implement - recyclerview android studio
Android Recyclerview vs ListView con Viewholder (8)
Bien, un poco de excavación y encontré estas gemas del
article
de Bill Philips en
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
- 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. Subclasifican
RecyclerView.ViewHolder
, que tiene un montón de métodos que utilizaRecyclerView
.ViewHolders
saben 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, yViewHolder
solo seViewHolder
a pequeños pedazos.Ahora, ViewHolder lo retiene todo en el campo
ViewHolder.itemView
, que está asignado en el constructor de ViewHolder para usted.
Recientemente me encontré con el Android
RecycleView
que se lanzó con Android 5.0 y parece que
RecycleView
es solo 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é elegiría usar RecycleView`?
Editar
Descubrí que las personas han hecho preguntas similares y las respuestas no son concluyentes, y las agregué aquí para mantener registros.
¿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ó 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 una 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 le brinda 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 pero complica un poco las cosas para el desarrollador.
En palabras simples, el RecyclerView es mucho más personalizable que el ListView y le da mucho control y poder a sus desarrolladores.
La otra ventaja de usar
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 sigue sin procesar, por ejemplo, no puede crear encabezado y pie de página .
Más article artículo de article (¡ve a leerlo!), 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: ¿Deben las vistas individuales manejar esos eventos, o debe ListView 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.
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.
mRecyclerView = (RecyclerView) findViewById (R.id.my_recycler_view); mRecyclerView.setLayoutManager (nuevo LinearLayoutManager (este)); mRecyclerView.setLayoutManager (nuevo GridLayoutManager (este, 2));
- 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.
Utilicé un cargador de imágenes
ListView
con Glide, que tenía un crecimiento de memoria.
Luego reemplacé el
ListView
con un
RecyclerView
.
No solo es más difícil en la codificación, sino que también conduce a un mayor uso de memoria que un
ListView
.
Al menos, en mi proyecto.
En otra actividad utilicé 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é un
ViewHolder
, ¿cómo podría reemplazar un
TextWatcher
durante el desplazamiento?
Entonces, usé un
ListView
sin
ViewHolder
, y funciona.
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 vincular ViewHolder con una posición. Otro punto a tener en cuenta aquí, es que al implementar el adaptador para RecyclerView, proporcionar un ViewHolder es obligatorio. 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 cambios 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 los 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 establece que puede ser útil para manipulaciones gestuales, ya que intercepta un evento táctil antes de que se entregue a RecyclerView.
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 , por lo que puede 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 a
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.