Sollten wir RecyclerView verwenden, um ListView zu ersetzen?

232

Android Docs sagen:

Das RecyclerView-Widget ist eine erweiterte und flexiblere Version von ListView. Dieses Widget ist ein Container zum Anzeigen großer Datenmengen, die durch Beibehalten einer begrenzten Anzahl von Ansichten sehr effizient gescrollt werden können. Verwenden Sie das RecyclerView-Widget, wenn Sie über Datensammlungen verfügen, deren Elemente sich zur Laufzeit aufgrund von Benutzeraktionen oder Netzwerkereignissen ändern

Tatsächlich ListViewkönnen alle oben genannten Aufgaben ausgeführt werden, wenn die Effizienz keine Rolle spielt, und wir haben beim RecyclerViewErsetzen viele Probleme festgestellt ListView:

  1. Es gibt kein onItemClickListener () für die Auswahl von Listenelementen - Lösung

  2. Keine Trennung zwischen Listenelementen - Lösung

  3. Kein eingebauter Überlappungswähler, es gibt keine visuelle Rückmeldung, wenn Sie auf Listenelement - Lösung klicken

  4. Keine addHeaderView für Listenkopf - Lösung

Vielleicht mehr Probleme ...

Wenn wir also RecyclerViewersetzen ListView, müssen wir viel zusätzliche Codierung vornehmen, um den gleichen Effekt wie zu erzielen ListView.

FRAGE:

  • Lohnt es sich , dass wir ersetzen ListViewmit RecyclerViewtotal?
  • Wenn nicht, in welchem ​​Fall sollten wir RecyclerViewstattdessen besser verwenden ListViewund umgekehrt?
Xcihnegn
quelle
9
Ihr Thread ist nur die erste Ausgabe und ist nicht meine Frage
Xcihnegn
3
Erwähnen Sie einfach, dass Sie eine Recycling-Ansicht verwenden müssen, wenn Sie eine reduzierte Aktionsleiste verwenden möchten. medium.com/android-bites/…
Francas
Sie sollten recyclerview verwenden, da es mehr Kontrolle bietet als listview. Es ist ein bisschen komplex, aber wenn Sie dort ankommen, wird Ihr Leben super einfach, wenn Sie sich mit Listen beschäftigen.
Sadashiv
3
besser ist der Feind des Guten.
Älterer Gott

Antworten:

118

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.

RecyclerView ist leistungsstark, wenn Sie Ihre Liste anpassen müssen oder bessere Animationen wünschen. Diese praktischen Methoden in ListView haben den Menschen große Probleme bereitet, weshalb RecyclerView ihnen eine flexiblere Lösung bietet.

Die wichtigste Änderung, die Sie für die Migration vornehmen müssen, befindet sich in Ihrem Adapter. Wenn Sie weiter telefonieren möchten notifyDataSetChanged, verlieren Sie die meisten Animations- und Bindungsvorteile. Wenn Sie Ihren Adapter jedoch so ändern können, dass detaillierte Benachrichtigungsereignisse (hinzugefügt / entfernt / verschoben / aktualisiert) ausgelöst werden, erhalten Sie viel bessere Animationen und eine bessere Leistung. Durch diese Ereignisse kann RecyclerView die richtigen Animationen auswählen und unnötige onBindAufrufe vermeiden . Sie erhalten einen großen Vorteil, wenn Ihre Artikelansichten komplex sind. In Zukunft wird es auch mehr Komponenten rund um RecyclerView geben.

Yigit
quelle
2
Wenn ich Ihnen 100 positive Stimmen geben könnte, würde ich. Die notifyDataSetChanged()Methode veranlasste mich RecyclerView, ViewHoldersständig nach neuen zu fragen und die Vorteile des ViewHolderMusters auszuschöpfen . Auf der Suche nach der Lösung habe ich Ihren Kommentar gefunden, der mein Problem fast nebenbei beantwortet: D danke!
Aspiring Dev
Ich bin nicht einverstanden "Sie erhalten einen großen Vorteil, wenn Ihre Artikelansichten komplex sind", ich habe recyclerView, in dem der Adapter 3 hat, wenn sonst Recyclerview in meinem Fall eine schlechte Leistung erbringt. Ich musste das Recycling mit deaktivieren isRecyclable(false);und das Endergebnis ist RecyclerView. Ich kann das nicht einmal ändern, es wird viel Zeit brauchen, um zur Listenansicht zurückzukehren :(
kashyap jimuliya
4
Menschen verwenden Wohnmobile mit viel mehr Typen als ohne Probleme und gute Leistung. In Ihrem Code stimmt noch etwas nicht. Sie sollten systrace / traceview verwenden und sehen, was los ist.
Yigit
1
@ kashyapjimuliya wie yigit erwähnt, 3 if-else sollte das nicht verursachen. Erstens haben Sie nicht erwähnt, wo Sie diese if-else platzieren; Zweitens sollte das Deaktivieren des Recyclings langsamer und nicht schneller werden. Warum? Weil das Aufblasen einer Ansicht und das Tun findViewById()viel teurer ist, als es ViewHolderso zu machen.
Sufian
24

Wenn ListView alle aktuellen Anforderungen Ihrer App erfüllt und alle Anwendungsfälle erfüllt, muss es meiner Meinung nach nicht durch ein RecyclerView ersetzt werden.

Der RecyclerView bietet seinen Entwicklern enorme Leistung auf Kosten der Erhöhung der Komplexität für die Entwickler. Es gibt bestimmte Dinge, die in einer ListView leicht erledigt werden können und jetzt viel unnötigen Aufwand erfordern.

Aber ja, es gibt viele Dinge, die eine ListView niemals tun kann, wie die erstaunliche LayoutManager-Funktion, mit der Sie das Layout nahtlos dynamisch in horizontales, vertikales, Gitter- oder versetztes Gitter ändern können.

Ich schrieb eine detaillierte Antwort zu diesem Thema hier .

Aritra Roy
quelle
3
Sicher, RecyclerView erhöht die Komplexität, implementiert aber zumindest das ViewHolder-Muster ordnungsgemäß für Sie.
IgorGanapolsky
@IgorGanapolsky +1 für die Implementierung des ViewHolder-Musters.
Sreekanth Karumanaghat
Sie können Ihre eigene Sicht Halter Muster ganz gut mit einem Listview schreiben
dan
9

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.

Also, wenn Effizienz Ihr Anliegen ist, dann ja , es ist eine gute Idee , ein Listview mit einem RecyclerView zu ersetzen.

Phantômaxx
quelle
19
Dies sind nicht meine Fragen, ich hatte Link für jede
Problemlösung
6

Ich hatte ListView bis vor kurzem noch für sehr einfache Listen verwendet. Zum Beispiel, wenn ich eine einfache Liste von Textoptionen anzeigen möchte ...

Ich habe diese Entscheidung auf 'menschliche Faktoren' gestützt, dass das Erstellen einer einfachen ListView mit weniger Code besser ist, wenn die Leistung unerheblich ist. Ich denke oft an einen Professor am College, der gern sagte: "Mein Lehrer, der große Niclaus Wirth, der Erfinder von Pascal, pflegte zu sagen, wenn ein Programm mehr als 50 Codezeilen enthält, ist es sicher falsch ..."

Was mich jedoch überzeugt hat, ListView nicht mehr zu verwenden, ist, dass es kürzlich zusammen mit RelativeLayout in die Kategorie "Legacy" im Android Studio-Designtool verschoben wurde.

https://developer.android.com/reference/android/widget/ListView

Ich denke, dies ist eine "weiche" Form der "Abwertung". Es wäre zu störend, wenn es tatsächlich veraltet wäre und alle gewissenhaften Entwickler ihren Code nach RecyclerView verschieben würden.

Darüber hinaus warnt das Intro zu ListView ganz oben, dass RecyclerView eine bessere Option ist: "Verwenden Sie RecyclerView, um Listen moderner, flexibler und leistungsfähiger anzuzeigen."
https://developer.android.com/reference/android/widget/ListView

In der Anleitung zu ListView geht es immer noch um Cursorlader, aber getSupportCursorLoader () selbst ist in API 28 gerade veraltet.
Https://developer.android.com/guide/topics/ui/layout/listview

Letzte Verbesserungen an Android Studio:

Datei -> Neu -> Fragment -> Fragment (Liste)

Dies gibt uns eine voll funktionsfähige RecylerView, die mit Basistext gefüllt ist. Damit ist mein letzter wirklicher Grund für die Verwendung von ListView beseitigt, da es jetzt genauso einfach ist, eine grundlegende RecylerView einzurichten.

Zusammenfassend möchte ich ListView überhaupt nicht für Neuentwicklungen verwenden, da die Kennzeichnung "Legacy" nur einen Schritt von der Ablehnung entfernt ist.

Elletlar
quelle
3

Der einzige Fall, in dem die Verwendung von ListView noch in Ordnung ist, ist, wenn die Liste nicht dynamisch ist oder von Netzwerkereignissen beeinflusst wird. Zum Beispiel: Navigation.

Für alle anderen Zwecke stellt RecyclerView ListView in den Schatten. Da sich RecyclerView nur um das Recycling kümmert, ist es einfacher, visuell verwandte Dinge zu tun, die in ListView eng miteinander verbunden sind, wie z. B. Ändern der Position / Neuanordnung, Animation (tatsächlich mit RecyclerView.ItemAnimator), benutzerdefinierte Layouts (der Bestand enthält zusätzlich StaggeredGrid) die alte Liste oder Raster Stil, aber es gibt auch diese Bibliothek die sie noch weiter erweitert).

Auch wenn Sie CardView verwenden möchten, ist dies meiner Meinung nach der einzige Weg (eine gute Lektüre, wenn Sie eine Karte oder eine Liste verwenden).

inmyth
quelle
Wenn Sie sich darauf beziehen, eine Liste von Daten von den Servern abzurufen und diese dann in SQLite auf dem Telefon zu speichern, um sie in einer Listenanzeige (z. B. Ihren Followern) zu verwenden, ist es besser, eine Recycler-Ansicht als eine Listenansicht mit einem Ansichtsinhaber zu verwenden ?
Lion789
Ja. Aber um genau zu sein, sehe ich keine Rolle mehr für ListView außer der Navigation, und das liegt daran, dass es meiner Meinung nach übertrieben ist, RecyclerView dort zu verwenden.
Inmyth
2

Eine gute Alternative ist die Verwendung des BaseAdapters. Es unterstützt die Verwendung des Viewholder-Musters und meins enthält mehr als 100 Zeilen mit Bitmaps und Schaltflächen und läuft sehr flüssig.

Grantespo
quelle