it-swarm.com.de

Sollten wir RecyclerView verwenden, um ListView zu ersetzen?

Android-Dokumente sagen:

Das RecyclerView-Widget ist eine erweiterte und flexiblere Version von ListView. Dieses Widget ist ein Container für die Anzeige 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 kann ListView all das tun, wenn die Effizienz keine Rolle spielt, und wir haben viele Probleme festgestellt, wenn wir RecyclerView verwenden, um ListView zu ersetzen:

  1. Es gibt keinen onItemClickListener () für die Auswahl von Listenelementen - solution

  2. Keine Teilung zwischen Listenelementen - Lösung

  3. Keine eingebaute Überlappungsauswahl, es gibt keine visuelle Rückmeldung, wenn Sie auf Listenelement - Lösung klicken

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

Vielleicht mehr Probleme ...

Wenn wir also RecyclerView verwenden, um ListView zu ersetzen, müssen wir viel zusätzliche Codierung durchführen, um den gleichen Effekt wie ListView zu erzielen.

FRAGE:

  • Lohnt es sich, ListView vollständig durch RecyclerView zu ersetzen?
  • wenn nicht, in welchem ​​Fall sollten wir dann besser RecyclerView anstelle von ListView verwenden und umgekehrt?
225
Xcihnegn

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 für Sie geeignet.

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

Die wichtigste Änderung, die Sie für die Migration vornehmen müssen, ist in Ihrem Adapter. Wenn Sie weiterhin notifyDataSetChanged aufrufen möchten, verlieren Sie die meisten Vorteile von Animation und Bindung. Wenn Sie Ihren Adapter jedoch so ändern können, dass er detaillierte Benachrichtigungsereignisse auslöst (hinzugefügt/entfernt/verschoben/aktualisiert), erhalten Sie viel bessere Animationen und eine bessere Leistung. Durch diese Ereignisse kann RecyclerView die richtigen Animationen auswählen und unnötige onBind Aufrufe vermeiden. Sie erhalten einen großen Vorteil, wenn Ihre Artikelansichten komplex sind. Außerdem wird es in Zukunft weitere Komponenten rund um RecyclerView geben.

117
yigit

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

Der RecyclerView bietet seinen Entwicklern eine 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 die jetzt eine Menge unnötiger Mühe kosten.

Aber ja, es gibt viele Dinge, die eine ListView niemals tun kann, wie die erstaunliche LayoutManager-Funktion, mit der Sie das Layout dynamisch nahtlos in horizontal, vertikal, gitterförmig oder gestaffelt ändern können.

Ich habe eine ausführliche Antwort zu diesem Thema geschrieben hier .

23
Aritra Roy

1 Sie können eine Schnittstelle verwenden, um einen Klicklistener bereitzustellen. Diese Technik verwende ich auch bei ListViews.
2 Kein Teiler: Fügen Sie einfach in Ihre Zeile eine Ansicht mit einer Breite von match_parent und eine Höhe von 1dp und geben Sie ihm eine Hintergrundfarbe .
3 Verwenden Sie einfach einen StateList-Selektor für den Zeilenhintergrund.
4 addHeaderView kann auch in ListViews vermieden werden: Setzen Sie einfach den Header nach außen die Ansicht.

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

8
Fantômas

Ich hatte bis vor kurzem noch ListView 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 Universitätsprofessor, der gern sagte: "Mein Lehrer, der große Niclaus Wirth, der Erfinder von Pascal, pflegte zu sagen, wenn ein Programm mehr als 50 Zeilen Code enthält, ist es sicher falsch ..."

Aber was mich davon überzeugt hat, ListView nicht mehr zu verwenden, ist, dass es vor kurzem in die Kategorie "Legacy" im Android= Studio-Design-Tool zusammen mit RelativeLayout verschoben wurde.

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

Ich denke, dies ist eine "sanfte" Form der "Abwertung". Es wäre zu störend, wenn es tatsächlich veraltet wäre und alle gewissenhaften Entwickler ihren Code auf RecyclerView verlagerten.

Darüber hinaus wird in der Einführung zu ListView ganz oben darauf hingewiesen, dass RecyclerView eine bessere Option ist: "Verwenden Sie RecyclerView, um eine modernere, flexiblere und performantere Darstellung von Listen zu erhalten."
https://developer.Android.com/reference/Android/widget/ListView

In der Anleitung zu ListView wird weiterhin über Cursor-Loader gesprochen, aber getSupportCursorLoader () selbst wurde gerade in API 28 als veraltet eingestuft.
https://developer.Android.com/guide/topics/ui/layout/listview

Letzte Verbesserungen an Android Studio:

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

Dies gibt uns einen voll funktionsfähigen RecylerView, der mit Basistext gefüllt ist. Damit habe ich meinen letzten wirklichen Grund für die Verwendung von ListView beseitigt, da es jetzt genauso einfach ist, ein einfaches RecylerView einzurichten.

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

5
Elletlar

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

Bei allen anderen Verwendungen wird ListView von RecyclerView in den Schatten gestellt. Da sich RecyclerView nur um das Recycling kümmert, ist es einfacher, visuell verwandte Dinge zu tun, die in ListView eng miteinander verbunden waren, wie das Ändern von Position/Neuanordnung, Animation (in der Tat ist es mit RecyclerView.ItemAnimator ausgestattet), benutzerdefinierte Layouts (das Material hat zusätzlich StaggeredGrid) der alte Listen- oder Rasterstil, aber es gibt auch diesen Bibliothek , der ihn noch erweitert).

Auch wenn Sie CardView verwenden möchten, ist dies meines Erachtens der einzige Weg (einige gute Lektüre wann Sie eine Karte oder Liste verwenden sollten).

3
inmyth

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

1
grantespo