RecyclerView vs. ListView


295

Vom Android-Entwickler ( Erstellen von Listen und Karten ):

Das RecyclerView-Widget ist eine erweiterte und flexiblere Version von ListView.

Okay, es klingt cool, aber als ich dieses Beispielbild sah, war ich wirklich verwirrt über den Unterschied zwischen diesen beiden.

Geben Sie hier die Bildbeschreibung ein

Das obige Bild kann einfach ListViewmit einem benutzerdefinierten Adapter erstellt werden.

Also, in welcher Situation sollte man verwenden RecyclerView?



1
@ Dev786: Ich schlage vor, dass Sie hier einen Kommentar hinzufügen, der ausführlich erklärt, was Ihrer Meinung nach in den vielen vorhandenen Antworten auf diese Frage fehlt .
CommonsWare

Antworten:


374

RecyclerViewwurde als ListViewVerbesserung erstellt, also ja, Sie können eine angehängte Liste mit ListViewKontrolle erstellen , aber die Verwendung RecyclerViewist einfacher, da es:

  1. Wiederverwendet Zellen beim Scrollen nach oben / unten - dies ist mit der Implementierung von View Holder im ListViewAdapter möglich, war jedoch optional, während RecycleViewdies die Standardmethode zum Schreiben des Adapters ist.

  2. Entkoppelt die Liste von ihrem Container - so können Sie Listenelemente zur Laufzeit einfach in die verschiedenen Container (linearLayout, gridLayout) mit Einstellung einfügen LayoutManager.

Beispiel:

mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
//or
mRecyclerView.setLayoutManager(new GridLayoutManager(this, 2));
  1. Animiert allgemeine Listenaktionen - Animationen werden entkoppelt und an delegiert ItemAnimator.

Es gibt mehr darüber RecyclerView, aber ich denke, diese Punkte sind die wichtigsten.

Zusammenfassend lässt sich sagen, dass RecyclerViewes sich um eine flexiblere Steuerung für den Umgang mit "Listendaten" handelt, die den Mustern der Delegation von Bedenken folgt und nur eine Aufgabe für sich lässt - das Recycling von Gegenständen.


16
Die Hauptverantwortung der Listenansicht besteht darin, 1.) Elemente innerhalb eines bestimmten Bereichs visuell anzuordnen und vorzugsweise 2.) Elemente wiederzuverwenden. Mit RecylerView gliedert sich dies in einzelne Verantwortlichkeiten: Recyceln von Ansichtsrecycling und LayoutManager ordnet Elemente auf dem Bildschirm an. Mit anderen Worten, die Recycling-Ansicht weiß nicht, wo Elemente auf dem Bildschirm angezeigt werden sollen, sondern kümmert sich nur um das Recycling. Aus dem Android-Dokument: "Durch Ändern des LayoutManagers kann eine RecyclerView verwendet werden, um eine Standardliste mit vertikalem Bildlauf, ein einheitliches Raster, versetzte Raster, horizontal scrollende Sammlungen und mehr zu implementieren."
daneejela

32
"Zellen beim Scrollen nach oben / unten wiederverwenden": Soweit ich weiß, ist dies völlig falsch, da dies sogar in der Listenansicht ohne Ansichtsinhaber geschieht.
Ruban

16
Die Hauptverwendung des Ansichtshalters in der Listenansicht ist, dass Ihr Code beim Scrollen von ListView möglicherweise häufig findViewById () aufruft, was die Leistung beeinträchtigen kann. Selbst wenn der Adapter eine aufgeblasene Ansicht zum Recycling zurückgibt, müssen Sie die Elemente nachschlagen und aktualisieren. Eine Möglichkeit, die wiederholte Verwendung von findViewById () zu umgehen, besteht darin, das Entwurfsmuster "Ansichtshalter" zu verwenden. Ein ViewHolder-Objekt speichert jede der Komponentenansichten im Tag-Feld des Layouts, sodass Sie sofort darauf zugreifen können, ohne sie wiederholt nachschlagen zu müssen.
Ruban

7
Ich versuche zu sagen, dass Row auch dann wiederverwendet wird, wenn Sie die Listenansicht ohne Ansichtsinhaber implementieren. Das ist die Eigenschaft und der Vorteil von Listview. Das ist es, was sie Listenansicht erstellt haben.
Ruban

Sie haben nichts Besonderes getan, diese Funktionen können von jedem hinzugefügt werden. Sie können ListView und baseAdapter erweitern und bei Bedarf beliebige Funktionen hinzufügen. Es gibt tatsächlich keinen Unterschied zwischen diesen beiden.
MDP

39

Damit Listenansichten eine gute Leistung erzielen, müssen Sie das Haltermuster implementieren. Dies kann leicht zu Problemen führen, insbesondere wenn Sie die Liste mit verschiedenen Arten von Ansichten füllen möchten.

Der RecyclerView backt dieses Muster ein, was das Durcheinander erschwert. Es ist auch flexibler und erleichtert die Handhabung verschiedener Layouts, die nicht gerade linear sind, wie z. B. ein Raster.


6
Ja ! Es sollte mehr Diskussionen darüber geben, wann recyclerview NICHT verwendet werden soll. Wenn in Ihren Zeilen Inhalte basierend auf den Modelldaten dynamisch hinzugefügt wurden und Sie die Recycler-Ansicht BOOM verwenden.
Rana Deep

1
Sie sollten in der Lage sein, dynamischen Inhalt basierend auf Modelldaten hinzuzufügen. Sie müssen lediglich unterschiedliche Ansichten für alle Arten von Inhalten einrichten, die Sie unterstützen möchten.
CaptRespect

36

ListViewist der Vorfahr von RecyclerView. Es gab viele Dinge, die ListViewentweder nicht oder nicht gut machten. Wenn Sie die Mängel von sammeln ListViewund das Problem lösen würden, indem Sie die Probleme in verschiedene Bereiche abstrahieren, erhalten Sie so etwas wie die Recycler-Ansicht. Hier sind die Hauptprobleme bei ListViews:

  • Die ViewWiederverwendung für dieselben Elementtypen wurde nicht erzwungen (sehen Sie sich einen der Adapter an, die in a verwendet ListViewwerden. Wenn Sie die Methode getView studieren, werden Sie feststellen, dass nichts einen Programmierer daran hindert, für jede Zeile eine neue Ansicht zu erstellen, selbst wenn eine übergeben wird über die convertViewVariable)

  • Kostspielige findViewByIdVerwendungen wurden nicht verhindert (Selbst wenn Sie Ansichten wie oben angegeben recyceln, konnten Entwickler aufrufen findViewById, um den angezeigten Inhalt untergeordneter Ansichten zu aktualisieren. Der Hauptzweck des ViewHolderMusters in ListViewsbestand darin, die findViewByIdAufrufe zwischenzuspeichern. Dies war jedoch nur der Fall verfügbar, wenn Sie davon wussten, da es überhaupt nicht Teil der Plattform war)

  • Nur unterstütztes vertikales Scrollen mit in Zeilen angezeigten Ansichten (Die Recycler-Ansicht kümmert sich nicht darum, wo Ansichten platziert und wie sie verschoben werden, sondern wird in a abstrahiert LayoutManager. Ein Recycler kann daher das traditionelle ListViewwie oben gezeigt sowie Dinge wie das GridView, aber unterstützen es ist nicht darauf beschränkt, es kann mehr, aber Sie müssen die Programmierarbeit leisten, um dies zu erreichen.

  • Animationen zum Hinzufügen / Entfernen waren kein Anwendungsfall, der berücksichtigt wurde. Es lag ganz bei Ihnen, herauszufinden, wie Sie vorgehen müssen (vergleichen Sie RecyclerView. Adapterklassen benachrichtigen * Methodenangebote v. ListViews, um sich ein Bild zu machen).

Kurz gesagt, es RecyclerViewist eine flexiblere Sichtweise ListView, obwohl möglicherweise mehr Codierung von Ihrer Seite vorgenommen werden muss.


20

Das RecyclerViewist eine neue Viewgroup , die vorbereitet wird jeder Adapter basierte Sicht auf eine ähnliche Art und Weise zu machen. Es wird vermutet, dass es der Nachfolger von ist ListView and GridView, und es kann in der gefunden werden latest support-v7 version. Das RecyclerViewwurde mit Blick auf die Erweiterbarkeit entwickelt , sodass es möglich ist, jedes erdenkliche Layout zu erstellen, jedoch nicht ohne eine kleine Dosis Schmerz.

Antwort von Antonio Leiva

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

RecyclerViewist in der Tat ein powerful viewals ListView. Weitere Informationen finden Sie auf dieser Seite .


5
Ich mag diesen Satz aus Ihrer Antwort: Dies ist Android, also sind die Dinge nie einfach. Dies gilt für die Entwicklung der Android-App, aber ich denke, es ist nur etwas falsch daran, wie sie die API sowie die zu erstellenden Muster entworfen haben Android App. Theoretisch sollte ein gutes Design alle möglichen Komplexitäten vor den Programmierern verbergen (für fortgeschrittene jedoch immer noch zugänglich sein). Was sie üblicherweise interessiert, sind die Geschäftslogik, Daten und andere Algorithmen, außer dass sie mit der Behandlung von Problemen im Zusammenhang mit der Benutzeroberfläche (und den derzeit auftretenden langwierigeren Problemen) zu kämpfen haben in der Android-Entwicklung).
Hoffnungslos

18

Im Folgenden sind einige wichtige Punkte / Unterschiede zwischen RecyclerView und ListView aufgeführt. Nehmen Sie Ihren Anruf mit Bedacht entgegen.

Wenn ListView für Sie funktioniert, gibt es keinen Grund für eine Migration. Wenn Sie eine neue Benutzeroberfläche schreiben, ist RecyclerView möglicherweise besser geeignet.

RecylerView hat ViewHolder eingebaut und muss keine eigenen wie in listView implementieren. Es unterstützt auch Benachrichtigungen bei bestimmten Indizes

Dinge wie das Animieren des Hinzufügens oder Entfernens von Elementen sind bereits in RecyclerView implementiert, ohne dass Sie etwas tun müssen

Wir können einen Layout-Manager mit einer RecyclerView verknüpfen. Dies kann verwendet werden, um zufällige Ansichten in der Recycle-Ansicht abzurufen, während dies in ListView eine Einschränkung war. In einer ListView ist nur die vertikale ListView verfügbar. Es gibt keine offizielle Möglichkeit, eine horizontale ListView zu implementieren. Mit einem RecyclerView können wir jetzt einen haben

i) LinearLayoutManager - unterstützt sowohl vertikale als auch horizontale Listen, ii) StaggeredLayoutManager - unterstützt Pinterest wie gestaffelte Listen, iii) GridLayoutManager - unterstützt die Anzeige von Rastern, wie sie in Galerie-Apps angezeigt werden.

Und das Beste ist, dass wir all dies dynamisch tun können, wie wir wollen.


14

Großer Vorteil :

ViewHolderist standardmäßig nicht verfügbar in ListView. Wir werden explizit innerhalb der erstellen getView(). RecyclerViewhat eingebaut Viewholder.


4

Zusätzlich zu den oben genannten Unterschieden gibt es noch einige weitere:

  1. RV trennt die Erstellung von Ansichten und die Bindung von Daten an die Ansicht. In LV müssen Sie überprüfen, ob convertView null ist oder nicht, um eine Ansicht zu erstellen, bevor Sie Daten daran binden. Im Falle von RV wird die Ansicht nur dann erstellt, wenn sie benötigt wird. Im Fall von LV kann man jedoch die Prüfung für die Konvertierungsansicht verpassen und jedes Mal eine Ansicht erstellen.

  2. Mit LayoutManager ist das Wechseln zwischen Raster und Liste jetzt einfacher.

  3. Es ist nicht erforderlich, alle Elemente zu benachrichtigen und zu aktualisieren, auch wenn nur ein einzelnes Element geändert wird.

  4. Bei LV musste View Caching implementiert werden. Es wird standardmäßig in RV bereitgestellt. (Es gibt einen Unterschied zwischen View Caching und Recycling.)

  5. Sehr einfache Artikelanimationen bei Wohnmobilen.


4

Vorteile von RecyclerView gegenüber Listview:

  1. Enthält standardmäßig ViewHolder.

  2. Einfache Animationen.

  3. Unterstützt horizontale, Gitter- und versetzte Layouts

Vorteile von listView gegenüber recyclerView:

  1. Einfach, Teiler hinzuzufügen.

  2. Kann den eingebauten arrayAdapter für einfache einfache Listen verwenden

  3. Unterstützt Kopf- und Fußzeile.

  4. Unterstützt OnItemClickListner.


4
Soweit ich recyclerView.addItemDecoration(new DividerItemDecoration(getContext(), LinearLayoutManager.VERTICAL));recyclerView = view.findViewById(R.id.feed);
weiß,

1
@nviens Für die Listenansicht können Sie einen Teiler hinzufügen, seine Höhe anpassen und seine Farbe in XML selbst ändern. Auch die aktuelle Implementierung für Divider ist in Ordnung. Es war ein Albtraum, zuvor Divider
Manohar Reddy

4

8 Unterschiede zwischen RecyclerView und ListView

Recyclerview vs ListView

1. ViewHolder-Muster

Das Muster, mit dem Aufrufe von findViewById () -Methoden reduziert werden.

In ListView können Sie problemlos eine Liste erstellen, ohne ViewHolder zu verwenden. Aber nicht im Fall von RecyclerView.

2. Adapter

Beide sind AdapterViews, ja. Es funktioniert basierend auf der Adapterklasse.

Es ist einfach, ListView mit Standardadaptern wie ArrayAdapter, CursorAdapter zu erstellen, aber RecyclerView bietet die RecyclerView.Adapter-Klasse, um eine neue benutzerdefinierte Adapterklasse zu erstellen.

Sie können ArrayAdapter oder einen anderen integrierten Adapter nicht mit RecyclerView verwenden.

3. Anordnung der Gegenstände

Ich habe Vertical ListView in einfachem und weniger Code erstellt. Aber was ist, wenn wir eine GridView erstellen müssen?

RecyclerView verwendet LayoutManager, um seine Elemente anzuordnen. Es gibt 3 LayoutManager-Klassen.

  • LinearLayoutManager - hilft beim Erstellen einer linearen Typliste .
  • GridLayoutManager - Wird zum Erstellen eines Grids verwendet.
  • StaggeredGridLayoutManager - Wird zum Erstellen von Staggeredgrid verwendet.

Animationen

In ListView fehlen grundlegende Animationen. RecyclerView enthält jedoch einfache Animationen.

Teiler

Der Android - Version: Teiler und android: dividerHeight Attribute oder setDivider (), setDividerHeight () hilft Ihnen bei der Listview benutzerdefinierten Teiler zu machen.

Seit 25.1.0 können Sie die DividerItemDecoration- Klasse verwenden, um einen einfachen Teiler zu erstellen .

Klicken Sie auf Ereignisse

In RecyclerView fehlt OnItemClickListener , ja, das ist sehr traurig. Sie geben dem Entwickler jedoch mehr Kontrolle, indem sie RecyclerView.OnItemTouchListener bereitstellen .

Benachrichtigungsmethoden

Sie müssen geeignete Benachrichtigungsmethoden aufrufen, um korrekte Animationen auszuführen. RecylcerView verfügt im Vergleich zu ListView über viele Benachrichtigungsmethoden *.


3

Ich denke, der Haupt- und größte Unterschied besteht darin, dass ListViewbeim Erstellen oder Platzieren nach der Position des Elements gesucht wird, andererseits RecyclerViewnach dem Typ des Elements. Wenn ein anderes Element mit demselben Typ erstellt wurde, wird RecyclerViewes nicht erneut erstellt. Es fragt zuerst den Adapter und dann den Recyclingpool. Wenn der Recyclingpool "Ja, ich habe einen ähnlichen Typ erstellt" RecyclerViewsagt, wird nicht versucht, denselben Typ zu erstellen. ListViewhat keinen solchen Pooling-Mechanismus.


2

Meiner Meinung nach RecyclerViewwurde versucht, das Problem mit dem in Listenansichten verwendeten Recycling-Muster anzugehen, da dies das Leben der Entwickler erschwerte. Alles andere konnte man mehr oder weniger bewältigen. Zum Beispiel verwende ich den gleichen Adapter für ListViewund GridViewes in beiden Ansichten der Sache nicht getView, getItemCount, getTypeCountverwendet wird , so ist es das gleiche. RecyclerViewwird nicht benötigt, wenn ListViewmit ListAdapteroder GridViewmit Netzadaptern bereits für Sie gearbeitet wird. Wenn Sie das ViewHolderMuster in Ihren Listenansichten korrekt implementiert haben, werden Sie keine große Verbesserung feststellen RecycleView.


2

Ich habe ein wenig mit gearbeitet RecyclerViewund bevorzuge es immer noch ListView.

  1. Sicher, beide verwenden ViewHolders, also ist dies kein Vorteil.

  2. A RecyclerViewist schwieriger zu codieren.

  3. A RecyclerViewenthält keine Kopf- und Fußzeile, daher ist es ein Minus.

  4. A ListViewmuss keinen ViewHolder erstellen. In Fällen, in denen Sie eine Liste mit Abschnitten oder Unterüberschriften haben möchten, ist es eine gute Idee, unabhängige Elemente (ohne ViewHolder) zu erstellen. Dies ist einfacher und erfordert keine separaten Klassen.


1
Sie können die Kopf- und Inhaltsseite im Recyclerview-Adapter festlegen. Diese ist flexibler als die Listenansicht. nur schwer zu ur Geist Listview zu recyclerview ändern , aber wenn Sie dies tun können, werden Sie verstehen , was ich als veraltet mean.listview nur go versuchen recyclerview goodluck zu lernen
erginduran

2
@erginduran, ich habe beide verwendet. ListView ist immer noch weit verbreitet und nicht veraltet. Außerdem verschwendet es weniger Speicher als RecyclerView. Wenn Sie nur eine ListView durch RecyclerView ersetzen möchten, ist dies keine gute Idee.
CoolMind

Überprüfen Sie einfach, warum diese Leute recyclerview für entwickelt haben? seine Verbesserung der Listenansicht, richtig? Es gibt viele alte Bibliotheken und Apps in Google Play, so dass Sie Recht haben. Listenansicht wird immer noch häufig verwendet. Lassen Sie einfach alte Dinge in der Vergangenheit. Vergleiche vergleichen -> Link
Erginduran

@erginduran, danke. Sie haben Recht, RecyclerView hat einige Vorteile. Meine Antwort betraf übliche Aufgaben, bei denen eine ListView manchmal einfacher ist als eine RecyclerView. Natürlich sind Animationen und einige andere Verbesserungen in einer ListView schwierig oder nicht möglich.
CoolMind

Ich habe in diesem Thema einige Aspekte hinzugefügt, siehe stackoverflow.com/a/39721769/2914140 .
CoolMind

1
  1. Sie können eine Schnittstelle verwenden, um einen Klick-Listener bereitzustellen. Ich verwende diese Technik auch bei ListViews.
  2. Kein Teiler: Fügen Sie Ihrer Zeile einfach eine Ansicht mit einer Breite von match_parent und einer Höhe von 1 dp hinzu und geben Sie ihr eine Hintergrundfarbe.
  3. Verwenden Sie einfach einen StateList-Selektor für den Zeilenhintergrund.
  4. addHeaderView kann auch in ListViews vermieden werden: Platzieren Sie den Header einfach außerhalb der Ansicht.

Wenn Effizienz Ihr Anliegen ist, ist es eine gute Idee, eine ListView durch eine RecyclerView zu ersetzen.


0

Einfache Antwort: Sie sollten RecyclerView in einer Situation verwenden, in der Sie viele Elemente anzeigen möchten und deren Anzahl dynamisch ist. ListView sollte nur verwendet werden, wenn die Anzahl der Elemente immer gleich ist und auf die Bildschirmgröße beschränkt ist.

Sie finden es schwieriger, weil Sie nur an die Android-Bibliothek denken.

Heutzutage gibt es viele Optionen, mit denen Sie Ihre eigenen Adapter erstellen können. So können Sie auf einfache Weise Listen und Raster dynamischer Elemente erstellen, die Sie auswählen, neu anordnen, Animationen, Teiler verwenden, Fußzeilen, Kopfzeilen usw. hinzufügen können.

Haben Sie keine Angst und probieren Sie RecyclerView aus. Sie können es lieben, wenn Sie eine Liste mit 100 aus dem Internet heruntergeladenen Elementen (wie Facebook-Nachrichten) in einer ListView und einer RecyclerView erstellen. Sie werden den Unterschied in der UX (Benutzer) sehen Erfahrung) Wenn Sie versuchen zu scrollen, wird die Test-App wahrscheinlich gestoppt, bevor Sie es überhaupt tun können.

Ich empfehle Ihnen, diese beiden Bibliotheken zu überprüfen, um einfache Adapter herzustellen:

FastAdapter von mikepenz

FlexibleAdapter von Davideas


1
Ich denke, Ihre Aussagen über den Leistungsunterschied zwischen den beiden sind übertrieben. Ich verwende ListView seit 2012 in einer Produktions-App und zeige bis zu 3000 Elemente mit ~ 10 verschiedenen Ansichten in jeder Zeile an. Selbst auf alten Android 2.3-Geräten gibt es absolut keine Leistungsprobleme.
Magnus W

0

RecyclerView-Informationen

Das RecyclerViewwurde mit eingeführt Android 5.0 (Lollipop). Es ist in der Support-Bibliothek enthalten . Somit ist es mit Android API Level 7 kompatibel.

Ähnlich wie das ListView, RecyclerView’sist Hauptidee zu schaffen , in einer Aufführung freundlich Auflistung Funktionalität. Der 'Recycler'-Teil des Namens dieser Ansicht ist nicht zufällig vorhanden. Der RecyclerViewkann tatsächlich die Gegenstände recyceln, mit denen er gerade arbeitet. Der Recyclingprozess erfolgt dank eines Musters namens View Holder .

Vor- und Nachteile von RecyclerView

Vorteile:

  • integrierte Animationen zum Hinzufügen, Aktualisieren und Entfernen von Elementen
  • Erzwingt das Recycling von Ansichten mithilfe des ViewHolder-Musters
  • unterstützt sowohl Raster als auch Listen
  • unterstützt vertikales und horizontales Scrollen
  • kann zusammen mit DiffUtil verwendet werden

Nachteile:

  • erhöht die Komplexität
  • nein OnItemClickListener

ListView-Informationen

Das ListViewgibt es schon seit Beginn von Android. Es war sogar in verfügbar API Level 1und hat den gleichen Zweck wie dasRecyclerView .

Die Verwendung der ListView ist eigentlich ganz einfach. In dieser Hinsicht ist es nicht wie sein Nachfolger. Die Lernkurve ist flüssiger als die für RecyclerView. Somit ist es leichter zu erfassen. Wir müssen uns nicht mit Dingen wie LayoutManager, ItemAnimator oder DiffUtil befassen.

Vor- und Nachteile von ListView

Vorteile:

  • einfache Verwendung
  • Standardadapter
  • verfügbar OnItemClickListener
  • Es ist das Fundament der ExpandableListView

Nachteile:

  • Die Verwendung des ViewHolder-Musters wird nicht berücksichtigt

0

Es gibt viele Unterschiede zwischen ListView und RecyclerView, aber Sie sollten insbesondere Folgendes beachten:

  • Das ViewHolder-Muster ist in ListView völlig optional, wird jedoch in RecyclerView integriert.
  • ListView unterstützt nur vertikales Scrollen, RecyclerView ist jedoch nicht auf vertikal scrollende Listen beschränkt.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.