RecyclerView vs. ListView

295

Del desarrollador de Android ( Creación de listas y tarjetas ):

El widget RecyclerView es una versión más avanzada y flexible de ListView.

De acuerdo, suena genial, pero cuando vi esta imagen de ejemplo, me confundí mucho sobre la diferencia entre estos dos.

ingrese la descripción de la imagen aquí

La imagen de arriba se puede crear fácilmente ListViewutilizando un adaptador personalizado.

Entonces, ¿en qué situación se debe usar RecyclerView?

Blaze Tama
fuente
1
@ Dev786: sugiero que agregue un comentario aquí que explique en detalle lo que siente que falta en las muchas respuestas existentes sobre esta pregunta.
CommonsWare

Respuestas:

374

RecyclerViewfue creado como una ListViewmejora, así que sí, puede crear una lista adjunta con ListViewcontrol, pero usarlo RecyclerViewes 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 ListViewadaptador, pero era algo opcional, mientras RecycleViewque es la forma predeterminada de escribir el adaptador.

  2. 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 LayoutManager.

Ejemplo:

mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
//or
mRecyclerView.setLayoutManager(new GridLayoutManager(this, 2));
  1. Anima acciones de lista común : las animaciones se desacoplan y se delegan en ellas ItemAnimator.

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

Entonces, para concluir, RecyclerViewes un control más flexible para el manejo de "datos de lista" que sigue patrones de delegación de preocupaciones y deja para sí solo una tarea: reciclar artículos.

daneejela
fuente
16
La responsabilidad principal de la vista de lista es 1.) organizar visualmente los elementos dentro del área determinada y preferiblemente 2.) reutilizar los elementos. Con RecylerView esto se divide en responsabilidades únicas: la vista de reciclaje recicla y se le da LayoutManager organiza los elementos en la pantalla. En otras palabras, la vista de reciclaje no sabe / no importa dónde colocar los elementos en la pantalla, solo se encarga de reciclarlos. De doc androide: "Al cambiar la LayoutManager un RecyclerView puede ser utilizado para implementar una lista de desplazamiento vertical estándar, una rejilla uniforme, escalonados rejillas, desplazamiento horizontal colecciones y más."
daneejela
32
"Reutilizar celdas mientras se desplaza hacia arriba / abajo": hasta donde sé, esto es completamente incorrecto porque esto sucede incluso en la vista de lista sin el marcador de vista.
Ruban
16
El uso principal del titular de la vista en la vista de lista es Su código puede llamar a findViewById () con frecuencia durante el desplazamiento de ListView, lo que puede ralentizar el rendimiento. Incluso cuando el Adaptador devuelve una vista inflada para reciclar, aún necesita buscar los elementos y actualizarlos. Una forma de evitar el uso repetido de findViewById () es usar el patrón de diseño "titular de vista". Un objeto ViewHolder almacena cada una de las vistas de componentes dentro del campo de etiqueta del diseño, por lo que puede acceder a ellas inmediatamente sin la necesidad de buscarlas repetidamente.
Ruban
77
Lo que intento decir es que Row se reciclará incluso cuando implemente la vista de lista sin el titular de la vista. Esa es la propiedad y la ventaja de listview. Eso es lo que crearon listview.
Ruban
no hicieron nada especial, cualquiera puede agregar estas características. puede extender ListView y baseAdapter y agregarle cualquier función si lo desea. en realidad no hay diferencia entre estos dos.
MDP
39

Para que las vistas de lista tengan un buen rendimiento, deberá implementar el patrón de soporte, y eso es fácil de estropear, especialmente cuando desea llenar la lista con varios tipos diferentes de vistas.

El RecyclerView incorpora este patrón, lo que hace que sea más difícil cometer errores. También es más flexible, lo que facilita el manejo de diferentes diseños, que no son lineales, como una cuadrícula.

CaptRespect
fuente
66
Si ! , debería haber más discusiones sobre cuándo NO usar la vista de reciclado también. Si sus filas tienen contenido agregado dinámicamente en función de los datos del modelo y utiliza la vista Recycler, BOOM.
Rana Deep
1
Debería poder agregar contenido dinámico basado en los datos del modelo. Solo tendrá que configurar diferentes vistas para cualquier tipo de contenido que desee admitir.
CaptRespect
36

ListViewes el antepasado de RecyclerView. Hubo muchas cosas que ListViewno hicieron o no hicieron bien. Si tuviera que reunir las deficiencias ListViewy resolver el problema abstrayendo los problemas en diferentes dominios, terminaría con algo así como la vista del reciclador. Estos son los principales puntos problemáticos con ListViews:

  • No impuso la ViewReutilización para los mismos tipos de elementos (observe uno de los adaptadores que se utilizan en un ListView, si estudia el método getView verá que nada impide que un programador cree una nueva vista para cada fila, incluso si se pasa uno a través de la convertViewvariable)

  • No impidió findViewByIdusos costosos (incluso si reciclaba las vistas como se indicó anteriormente, era posible que los desarrolladores llamaran findViewByIdpara actualizar los contenidos mostrados de las vistas secundarias. El propósito principal del ViewHolderpatrón ListViewsera almacenar en caché las findViewByIdllamadas. Sin embargo, esto era solo disponible si lo sabías, ya que no era parte de la plataforma)

  • Solo admite el desplazamiento vertical con vistas visualizadas en fila (la vista del reciclador no le importa dónde se colocan las vistas y cómo se mueven, se abstrae en una LayoutManager. Por lo tanto, un reciclador puede admitir lo tradicional ListViewcomo se muestra arriba, así como cosas como el GridView, pero no se limita a eso, puede hacer más, pero debe hacer el trabajo de programación para que esto suceda).

  • Las animaciones para agregar / eliminar no fueron un caso de uso que se consideró. Depende completamente de usted averiguar cómo hacer esto (compare RecyclerView. Las clases de adaptadores notifican * las ofertas de métodos v. ListViews para tener una idea).

En resumen, RecyclerViewes una versión más flexible ListView, aunque es posible que deba hacerse más codificación de su parte.

Jim Baca
fuente
20

El RecyclerViewes un nuevo ViewGroup que está preparado para representar cualquier vista basada en adaptador de una manera similar. Se supone que es el sucesor de ListView and GridView, y se puede encontrar en el latest support-v7 version. Se RecyclerViewha desarrollado con la extensibilidad en mente, por lo que es posible crear cualquier tipo de diseño que se te ocurra, pero no sin una pequeña dosis de dolor en el culo.

Respuesta tomada de Antonio leiva

 compile 'com.android.support:recyclerview-v7:27.0.0'

RecyclerViewes de hecho un powerful viewque ListView. Para más detalles puede visitar esta página .

IntelliJ Amiya
fuente
55
Me gusta esta frase de su respuesta: Esto es Android, por lo que las cosas nunca son fáciles Esto es cierto para lo que ha sido el desarrollo de la aplicación de Android, pero creo que es algo incorrecto en cómo diseñaron la API, así como los patrones para construir Aplicación Android. Teóricamente, un buen diseño debería ocultar todas las complejidades posibles de los programadores (pero aún así ser accesible para los avanzados), lo que comúnmente les importa es la lógica de negocios, los datos y otros algoritmos además de luchar para manejar los problemas relacionados con la interfaz de usuario (y los problemas más tediosos actualmente presentes) en desarrollo de Android).
Sin esperanza
18

Los siguientes son algunos puntos clave / diferencias entre RecyclerView y ListView. Toma tu llamada sabiamente.

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.

RecylerView ha incorporado ViewHolder, no necesita implementar nuestro propio like en listView. Es compatible con notificar en un índice particular también

Cosas como animar la adición o eliminación de elementos ya están implementados en RecyclerView sin que tenga que hacer nada

Podemos asociar un administrador de diseño con un RecyclerView, esto puede usarse para obtener vistas aleatorias en la vista de reciclaje, mientras que esto era una limitación en ListView. 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 mostrar 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.

Pawan Maheshwari
fuente
14

Gran ventaja:

ViewHolderno está disponible por defecto en ListView. Vamos a crear explícitamente dentro del getView(). RecyclerViewTiene incorporado Viewholder.

Mohammed Imran N
fuente
4

Además de las diferencias anteriores, hay algunas más:

  1. RV separa la creación de la vista y el enlace de datos a la vista. En LV, debe verificar si convertView es nulo o no para crear la vista, antes de vincular los datos. Por lo tanto, en el caso de RV, la vista se creará solo cuando sea necesario, pero en el caso de LV, uno puede pasar por alto la verificación de convertview y creará una vista cada vez.

  2. Cambiar entre Grid y List es más fácil ahora con LayoutManager.

  3. No es necesario notificar y actualizar todos los elementos, incluso si solo se cambia un elemento.

  4. Había que implementar el almacenamiento en caché de vistas en caso de LV. Se proporciona en RV por defecto. (Hay una diferencia entre el almacenamiento en caché de vista y el reciclaje).

  5. Animaciones de elementos muy fáciles en caso de RV.

Virat18
fuente
4

Ventajas de RecyclerView sobre listview:

  1. Contiene ViewHolder de forma predeterminada.

  2. Animaciones fáciles

  3. Admite diseños horizontales, de cuadrícula y escalonados

Ventajas de listView sobre recyclerView:

  1. Divisor fácil de agregar.

  2. Puede usar el adaptador incorporado de matriz para listas simples

  3. Soporta encabezado y pie de página.

  4. Soporta OnItemClickListner.

Manohar Reddy
fuente
44
Por lo que yo entiendo, puede agregar fácilmente un divisor a un reciclador recyclerView.addItemDecoration(new DividerItemDecoration(getContext(), LinearLayoutManager.VERTICAL));recyclerView = view.findViewById(R.id.feed);
Vista
1
@nviens Para la vista de lista, puede agregar un divisor, ajustar su altura y cambiar su color todo en xml. También la implementación actual para el divisor está bien, fue una pesadilla agregar el divisor para la vista del reciclador anteriormente, solo verifique esta respuesta para ver cómo la implementación anterior del divisor fue stackoverflow.com/a/27037230/6478047
Manohar Reddy
4

8 diferencias entre RecyclerView y ListView

Recyclerview vs ListView

1. Patrón ViewHolder

El patrón utilizado para reducir las llamadas a los métodos findViewById () .

En ListView, puede crear fácilmente una lista sin usar ViewHolder. Pero no en el caso de RecyclerView.

2. Adaptador

Ambos son AdaptViews, sí. Funciona según la clase de adaptador.

Es fácil construir ListView usando adaptadores predeterminados como ArrayAdapter, CursorAdapter pero RecyclerView proporciona la clase RecyclerView.Adapter, para crear una nueva clase de adaptador personalizado.

No puede usar ArrayAdapter ni ningún otro adaptador incorporado con RecyclerView.

3. Arreglo de artículos

He creado Vertical ListView en código simple y menos. Pero, ¿qué pasa si necesitamos crear un GridView?

RecyclerView utiliza LayoutManager para organizar sus elementos. Hay 3 clases de LayoutManager.

  • LinearLayoutManager : ayuda a crear una lista de tipos lineales.
  • GridLayoutManager : se utiliza para crear Grid.
  • StaggeredGridLayoutManager : se usa para crear una cuadrícula escalonada.

Animaciones

ListView carece de animaciones básicas. Pero RecyclerView viene con animaciones simples.

Divisor

El androide: divisor y android: dividerHeight atributos o setDivider (), setDividerHeight () te ayudan a crear un divisor personalizado en ListView.

desde 25.1.0, puede usar la clase DividerItemDecoration para hacer un divisor simple.

Haga clic en eventos

RecyclerView carece de OnItemClickListener , sí, eso es muy triste. Pero le dan más control al desarrollador al proporcionar RecyclerView.OnItemTouchListener.

Métodos de notificación

Debe llamar a los métodos de notificación * apropiados para realizar animaciones correctas. RecylcerView tiene muchos métodos de notificación * cuando se compara con ListView.

Vijay Ram
fuente
3

Creo que la diferencia principal y más grande que tienen es que ListViewbusca la posición del elemento al crearlo o colocarlo, por otro lado, RecyclerViewbusca el tipo de elemento. si hay otro elemento creado con el mismo tipo, RecyclerViewno lo crea nuevamente. Pide el primer adaptador y luego pide reciclado, si el grupo reciclado dice "sí, he creado un tipo similar", entonces RecyclerViewno intenta crear el mismo tipo. ListViewno tiene este tipo de mecanismo de agrupación.

Mustafa Güven
fuente
2

En mi opinión, RecyclerViewse hizo para abordar el problema con el patrón de reciclaje utilizado en las vistas de lista porque estaba dificultando la vida del desarrollador. Todo lo demás que puedas manejar más o menos. Por ejemplo, yo uso el mismo adaptador para ListViewy GridViewno importa en ambos puntos de vista de los getView, getItemCount, getTypeCountse utiliza lo que es lo mismo. RecyclerViewno es necesario si ListViewcon ListAdaptero GridViewcon adaptadores de red ya está funcionando para usted. Si ha implementado correctamente el ViewHolderpatrón en sus vistas de lista, entonces no verá ninguna mejora importante RecycleView.

aimiliano
fuente
2

Trabajé un poco con RecyclerViewy todavía prefiero ListView.

  1. Claro, ambos usan ViewHolders, así que esto no es una ventaja.

  2. A RecyclerViewes más difícil en la codificación.

  3. A RecyclerViewno contiene un encabezado y pie de página, por lo que es un signo menos.

  4. A ListViewno requiere hacer un ViewHolder. En los casos en que desee tener una lista con secciones o subtítulos, sería una buena idea hacer elementos independientes (sin ViewHolder), es más fácil y no requiere clases separadas.

CoolMind
fuente
1
puede hacer que el encabezado y el contenido estén en el adaptador de la vista de reciclaje y será más flexible que la vista de lista simplemente es difícil de cambiar la mente ur vista de lista a recyclerview pero si se puede hacer esto, usted entenderá lo que mean.listview DEPRECATED acaba de ir a tratar de aprender recyclerview Goodluck
erginduran
2
@erginduran, usé ambos. ListView todavía se usa ampliamente y no está en desuso. También desperdicia menos memoria que RecyclerView. Si solo desea reemplazar un ListView con RecyclerView, no será una buena idea.
CoolMind
solo compruebe por qué estos chicos desarrollaron la vista de reciclaje? su mejora de listview, ¿verdad? Hay muchas bibliotecas y aplicaciones antiguas en Google Play, por lo que tiene razón, la vista de lista todavía se usa ampliamente. Solo deje las cosas viejas en el pasado. verificar comparaciones -> enlace
erginduran
@erginduran, gracias. Tienes razón, RecyclerView tiene algunas ventajas. Mi respuesta fue sobre las tareas habituales en las que un ListView a veces es más fácil que un RecyclerView. Por supuesto, la animación y algunas otras mejoras son difíciles o imposibles en ListView.
CoolMind
Agregué algunos aspectos en ese tema, consulte stackoverflow.com/a/39721769/2914140 .
CoolMind
1
  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 sí, es una buena idea reemplazar un ListView con un RecyclerView.

Jay Patel
fuente
0

Respuesta simple: debe usar RecyclerView en una situación en la que desea mostrar muchos elementos, y el número de ellos es dinámico. ListView solo debe usarse cuando el número de elementos es siempre el mismo y está limitado al tamaño de la pantalla.

Le resulta más difícil porque está pensando solo con la biblioteca de Android en mente.

Hoy en día, existen muchas opciones que lo ayudan a construir sus propios adaptadores, lo que facilita la creación de listas y cuadrículas de elementos dinámicos que puede elegir, reordenar, usar animación, divisores, agregar pies de página, encabezados, etc.

No se asuste y pruebe RecyclerView, puede comenzar a amarlo haciendo una lista de 100 elementos descargados de la web (como noticias de Facebook) en ListView y RecyclerView, verá la diferencia en la UX (usuario experiencia) cuando intentas desplazarte, probablemente la aplicación de prueba se detendrá antes de que puedas hacerlo.

Le recomiendo que revise estas dos bibliotecas para hacer adaptadores fáciles:

FastAdapter por mikepenz

FlexibleAdapter por davideas

Erick Moya
fuente
1
Creo que sus declaraciones sobre la diferencia de rendimiento entre los dos son exageradas. He estado usando ListView en una aplicación de producción desde 2012, mostrando hasta 3000 elementos con ~ 10 Vistas diferentes en cada fila, sin ningún problema de rendimiento, incluso en dispositivos Android 2.3 antiguos.
Magnus W
0

RecyclerVer información

El RecyclerViewfue introducido con Android 5.0 (Lollipop). está incluido en la Biblioteca de soporte . Por lo tanto, es compatible con Android API Level 7.

De manera similar a la idea principal ListView, RecyclerView’ses proporcionar la funcionalidad de listado de una manera amigable con el rendimiento. La parte 'Recycler' del nombre de esta vista no está ahí por coincidencia. En RecyclerViewrealidad, puede reciclar los elementos con los que está trabajando actualmente. El proceso de reciclaje se realiza gracias a un patrón llamado View Holder .

Pros y contras de RecyclerView

Pros:

  • animaciones integradas para agregar, actualizar y eliminar elementos
  • impone el reciclaje de vistas utilizando el patrón ViewHolder
  • admite tanto cuadrículas como listas
  • admite desplazamiento vertical y horizontal
  • se puede usar junto con DiffUtil

Contras:

  • agrega complejidad
  • sin OnItemClickListener

Información de ListView

El ListViewha existido desde el comienzo de Android. Estaba disponible incluso en API Level 1y tiene el mismo propósito que el RecyclerView.

El uso de ListView es realmente muy simple. En este aspecto, no es como su sucesor. La curva de aprendizaje es más suave que la de RecyclerView. Por lo tanto, es más fácil de entender. No tenemos que lidiar con cosas como LayoutManager, ItemAnimator o DiffUtil.

Pros y contras de ListView

Pros:

  • uso simple
  • adaptadores predeterminados
  • OnItemClickListener disponible
  • es la base de la ExpandableListView

Contras:

  • no abarca el uso del patrón ViewHolder
Basi
fuente
0

Existen muchas diferencias entre ListView y RecyclerView, pero debe tener en cuenta lo siguiente en particular:

  • El patrón ViewHolder es completamente opcional en ListView, pero está integrado en RecyclerView.
  • ListView solo admite el desplazamiento vertical, pero RecyclerView no se limita a las listas de desplazamiento vertical.
sachin pareek
fuente