RecyclerView vs. ListView

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

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

Está bien, suena genial, pero cuando vi esta imagen de ejemplo me confundí mucho acerca de la diferencia entre los dos.

enter image description here

La imagen de arriba puede ser creada fácilmente por ListView con adaptador personalizado.

Entonces, ¿en qué situación debería uno usar 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:

  1. Reutiliza las celdas mientras se desplaza hacia arriba o hacia abajo : esto es posible con la implementación de View Holder en el adaptador de listView, pero fue una opción, mientras que en RecycleView es la forma predeterminada de escribir el adaptador.

  2. Desacopla la lista de su contenedor , por lo que puede poner elementos de 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.my_recycler_view); mRecyclerView.setLayoutManager(new LinearLayoutManager(this)); //or mRecyclerView.setLayoutManager(new GridLayoutManager(this, 2)); 
  1. Anima acciones de lista comunes : las animaciones se desacoplan y se delegan en ItemAnimator .

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

Entonces, para concluir, RecyclerView es un control más flexible para manejar los “datos de lista” que sigue los patrones de delegación de preocupaciones y deja para sí solo una tarea: reciclar elementos.

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

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

ListView es el antecesor de RecyclerView . Hubo muchas cosas que ListView no hizo, o no funcionó bien. Si reuniera las deficiencias de ListView y resolviera el problema abstrayendo los problemas en diferentes dominios, terminaría con algo parecido a la vista de reciclador. Estos son los principales puntos problemáticos con ListViews:

  • No exigió View Reuse para los mismos tipos de elementos (consulte uno de los adaptadores que se usan en un ListView , si estudia el método getView verá que nada impide que un progtwigdor cree una nueva vista para cada fila, incluso si una es pasado a través de la variable convertView )

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

  • Solo desplazamiento vertical admitido con filas visualizadas (la vista de reciclador no se preocupa de dónde se ubican las vistas y cómo se mueven, sino que se abstrae en un LayoutManager . Por lo tanto, un reciclador puede admitir el ListView tradicional como se muestra arriba, así como cosas como GridView , pero no se limita a eso, puede hacer más, pero tienes que hacer el trabajo de progtwigción de pies para que suceda).

  • Las animaciones para agregar / eliminar no eran un caso de uso que se consideró. Depende completamente de usted averiguar cómo hacerlo (compare las clases de adaptador RecyclerView. Notifique las ofertas del método v. ListViews para tener una idea).

En resumen, RecyclerView es una RecyclerView más flexible de ListView , aunque es posible que haya que hacer más codificaciones de su parte.

The RecyclerView es un nuevo ViewGroup que está preparado para representar cualquier vista basada en adaptador de forma similar. Se supone que es el sucesor de ListView and GridView , y se puede encontrar en la latest support-v7 version . RecyclerView ha sido desarrollado teniendo en cuenta la extensibilidad , 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' 

RecyclerView es de hecho una powerful view que ListView . Para más detalles, puede visitar esta página .

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, es posible que esté mejor con RecyclerView.

RecylerView tiene incorporado ViewHolder, no necesita implementar el nuestro como en listView. También admite notificar a un índice en particular

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

Podemos asociar un administrador de diseño con un RecyclerView, esto se puede usar para obtener vistas aleatorias en recycleview mientras esto era una limitación en ListView 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 mostrar cuadrículas 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.

Gran ventaja:

ViewHolder no está disponible de forma predeterminada en ListView . Crearemos explícitamente dentro de getView() . RecyclerView tiene un Viewholder incorporado.

Creo que la diferencia principal y más grande que tienen es que ListView busca la posición del elemento mientras lo crea o lo coloca; por otro lado, RecyclerView busca el tipo de elemento. si hay otro elemento creado con el mismo tipo, RecyclerView no lo vuelve a crear. Pregunta al primer adaptador y luego pregunta si recicló el grupo, si el grupo reciclado dice “sí, he creado un tipo similar”, entonces RecyclerView no intenta crear el mismo tipo. ListView no tiene este tipo de mecanismo de agrupamiento.

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

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

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

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

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

  5. Animaciones de artículos muy fáciles en caso de RV.

En mi opinión, RecyclerView se creó para abordar el problema con el patrón de reciclaje utilizado en las listas de visitas porque dificultaba la vida del desarrollador. Todo lo demás podrías manejar más o menos. Por ejemplo, uso el mismo adaptador para ListView y GridView , no importa en ambas vistas, se usa getView , getItemCount , getTypeCount , así que es lo mismo. RecyclerView no es necesario si ListView con ListAdapter o GridView con adaptadores de red ya están trabajando para usted. Si ha implementado correctamente el patrón ViewHolder en su lista de vistas, entonces no verá ninguna gran mejora sobre RecycleView .

Trabajé un poco con RecyclerView y aún prefiero ListView .

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

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

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

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

  1. Puede usar una interfaz para proporcionar un oyente de clic. 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 asígnele 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.

Ventajas de RecyclerView sobre listview:

  1. Contiene ViewHolder de forma predeterminada.

  2. Animaciones fáciles

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

Ventajas de listView over recyclerView:

  1. Fácil de agregar divisor.

  2. Puede usar arrayAdapter incorporado para listas sencillas simples

  3. Admite encabezado y pie de página.

  4. Admite OnItemClickListner.

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

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

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

No te asustes y prueba RecyclerView, puedes comenzar a encantarlo haciendo una lista de 100 elementos descargados de la web (como noticias de Facebook) en un ListView y un RecyclerView, verás la diferencia en el UX (usuario experiencia) cuando intenta desplazarse, probablemente la aplicación de prueba se detendrá antes de que pueda hacerlo.

Te recomiendo que compruebes estas dos bibliotecas para hacer adaptadores fáciles:

FastAdapter por mikepenz

FlexibleAdapter por davideas