RecyclerView vs ListView


Desde Android developer (Creando Listas y Tarjetas):

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

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

introduzca la descripción de la imagen aquí

La imagen de arriba se puede crear fácilmente mediante ListView con un adaptador personalizado.

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

Author: chewbapoclypse, 2014-11-04

13 answers

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

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

  2. Desacopla la lista de su contenedor - para que pueda poner 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 comunes de la lista - Las animaciones se desacoplan y se delegan a ItemAnimator.

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

Así que, para concluir, RecyclerView es 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 - el reciclaje de artículos.

 317
Author: daneejela,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-22 13:32:41

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

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

 34
Author: CaptRespect,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-23 20:13:16

ListView es el antepasado de RecyclerView. Hubo muchas cosas que ListView no hicieron, o no hicieron bien. Si usted fuera a reunir las deficiencias de la ListView y resuelto el problema mediante la abstracción de los problemas en diferentes dominios que terminaría con algo como la vista recycler. Estos son los principales puntos problemáticos con ListViews:

  • No forzó View la reutilización para los mismos tipos de elementos (mire uno de los adaptadores que se usan 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 una a través de la variable convertView)

  • No evitó costosos usos de findViewById (Incluso si estaba reciclando vistas como se señaló anteriormente, era posible que los desarrolladores llamaran a findViewById para actualizar el contenido mostrado de las vistas secundarias. El propósito principal del patrón ViewHolder en ListViews era almacenar en caché las llamadas findViewById. Sin embargo, esto solo estaba disponible si lo sabías, ya que no era parte de la plataforma en absoluto)

  • Solo se admite el desplazamiento vertical con vistas de fila mostradas (la vista Recycler no se preocupa por dónde se colocan las vistas y cómo se mueven, se abstrae en un LayoutManager. Por lo tanto, un reciclador puede soportar el tradicional ListView como se muestra anteriormente, así como cosas como el GridView, pero no se limita a eso, puede hacer más, pero tienes que hacer el trabajo de programación para que suceda).

  • Animaciones a añadido / eliminado no era un uso caso que fue considerado. Fue completamente hasta usted para averiguar cómo ir sobre esto (comparar el RecyclerView. Las clases del adaptador notifican * las ofertas del método v. ListViews para tener una idea).

En resumen, RecyclerView es una versión más flexible de ListView, aunque es posible que tenga que hacer más codificación por su parte.

 29
Author: Jim Baca,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-23 11:52:48

El RecyclerView es un nuevo ViewGroup que está preparado para renderizar 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. Las RecyclerView se ha desarrollado con extensibilidad en mente, por lo que es posible crear cualquier tipo de diseño que se te ocurra, pero no sin un poco de dolor en el culo dosis.

Respuesta tomada de Antonio leiva

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

RecyclerView es de hecho un powerful view than ListView. Para más detalles puede visitar Esta página.

 19
Author: IntelliJ Amiya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-11 06:40:45

Los siguientes son algunos puntos clave/diferencias entre RecyclerView y ListView. Tome su llamada sabiamente.

Si ListView funciona para usted, no hay razón para migrar. Si usted es al escribir una nueva interfaz de usuario, podría estar mejor con RecyclerView.

RecylerView tiene ViewHolder incorporado, no necesita implementar el nuestro como en ListView. Soporte de ti notificar en un índice particular, así

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

Podemos asociar un gestor de maquetación con un RecyclerView, esto puede ser se usa para obtener vistas aleatorias en recycleview mientras que esto era una limitación en ListView En una ListView, el único tipo de vista disponible es el ListView vertical. No hay una manera oficial de implementar una vista de lista horizontal. Ahora usando un RecyclerView, podemos tener un

I) LinearLayoutManager-que soporta tanto vertical como horizontal listas, ii) StaggeredLayoutManager-que es compatible con Pinterest como listas escalonadas, iii) GridLayoutManager-que admite la visualización cuadrículas como se ve en las aplicaciones de galería.

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

 15
Author: Pawan Maheshwari,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-13 05:16:40

Gran ventaja:

ViewHolder no está disponible por defecto en ListView. Estaremos creando explícitamente dentro del getView(). RecyclerView tiene incorporado Viewholder.

 13
Author: Mohammed Imran N,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-14 07:05:48

Creo que la principal y mayor diferencia que tienen es que ListView busca la posición del elemento mientras lo crea o lo pone, por otro lado RecyclerView busca el tipo del elemento. si hay otro elemento creado con el mismo tipo RecyclerView no lo crea de nuevo. Pregunta primero el adaptador y luego pregunta a recycledpool, si recycled pool dice "sí, he creado un tipo similar a él", entonces RecyclerView no intenta crear el mismo tipo. ListView no tiene este tipo de mecanismo de agrupación.

 3
Author: Mustafa Güven,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-14 06:44:14

Además de las diferencias anteriores, las siguientes son algunas más:

  1. RV separa la creación de vistas y el enlace de datos a la vista. En LV, debe verificar si convertView es null o no para crear vista, antes de vincular datos a ella. Por lo tanto, en el caso de RV, view se creará solo cuando sea necesario, pero en el caso de LV, uno puede perder la comprobación de convertview y creará view cada vez.

  2. Cambiar entre la cuadrícula y la lista 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. Uno tenía que implementar el almacenamiento en caché de vista en caso de LV. Se proporciona en RV por defecto. (Hay diferencia entre el almacenamiento en caché de vista y el reciclaje.)

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

 3
Author: Virat18,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-06 20:47:25

En mi opinión RecyclerView se hizo para abordar el problema con el patrón de reciclaje utilizado en listviews porque estaba haciendo la vida del desarrollador más difícil. Todos los demás que podría manejar más o menos. Por ejemplo, uso el mismo adaptador para ListView y GridView no importa en ambas vistas el getView, getItemCount, getTypeCount se usa para que sea lo mismo. RecyclerView no es necesario si ListView con ListAdapter o GridView con adaptadores de red ya está funcionando para usted. Si ha implementado correctamente el patrón ViewHolder en su listviews entonces no verá ninguna gran mejora sobre RecycleView.

 2
Author: aimiliano,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-14 06:35:23

Trabajé un poco con RecyclerView y todavía prefiero ListView.

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

  2. A RecyclerView es más difícil de codificar.

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

  4. A ListView no 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 un ViewHolder), es más fácil y no requiere clases separadas.

 2
Author: CoolMind,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-12 14:29:22
  1. Puede usar una interfaz para proporcionar un oyente de clics. Yo uso esto técnica con vistas de lista, también.
  2. Sin divisor: Simplemente agregue en su fila una vista con un ancho de match_parent y una altura de 1dp y darle un color de fondo.
  3. Simplemente use un selector de lista de estados para el fondo de la fila.
  4. addHeaderView también se puede evitar en ListViews: simplemente ponga Cabecera fuera de la vista.

Entonces, si la eficiencia es su preocupación, entonces sí, es una buena idea reemplazar un ListView con RecyclerView.

 1
Author: Jay Patel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-12 18:27:42

Ventajas de RecyclerView sobre listview:

  1. Contiene ViewHolder por defecto.

  2. Animaciones fáciles.

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

Ventajas de ListView sobre RecyclerView:

  1. Fácil de añadir divisor.

  2. Puede usar ArrayAdapter incorporado para listas simples

  3. Soporta Encabezado y pie de página .

  4. Compatible con OnItemClickListner .

 1
Author: Redman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-10 12:19:43

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.

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

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

No te asustes y dar una oportunidad a RecyclerView, usted puede empezar a amar haciendo una lista de 100 elementos descargados de la web (como facebook news) en un ListView y un RecyclerView, verá la diferencia en la UX (experiencia de usuario) cuando intenta desplazarse, probablemente la aplicación de prueba se detendrá antes de que incluso se puede hacerlo.

Te recomiendo que revises estas dos bibliotecas para hacer más fácil adaptadores:

FastAdapter de mikepenz

FlexibleAdapter de davideas

 0
Author: Erick Moya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-15 02:19:44