RecyclerView-Teile und -Funktionen
RecyclerView
behandelt einige Aufgaben intern (z. B. das Scrollen und Recyceln von Ansichten), aber es ist im Wesentlichen ein Manager, der Hilfsklassen koordiniert, um eine Sammlung anzuzeigen.
RecyclerView
delegiert Aufgaben an die folgenden Hilfsklassen:
Adapter
– Vergrößert Elementlayouts (instanziiert den Inhalt einer Layoutdatei) und bindet Daten an Ansichten, die in einemRecyclerView
angezeigt werden. Der Adapter meldet auch Item-Click-Ereignisse.LayoutManager
– Misst und positioniert Elementansichten in einemRecyclerView
und verwaltet die Richtlinie für das Wiederverwenden von Ansichten.ViewHolder
– Sucht und speichert Ansichtsverweise. Der Ansichtshalter hilft auch beim Erkennen von Klicks in der Elementansicht.ItemDecoration
– Ermöglicht einer App das Hinzufügen spezieller Zeichnungs- und Layoutoffsets zu bestimmten Ansichten zum Zeichnen von Trennlinien zwischen Elementen, Hervorhebungen und visuellen Gruppierungsgrenzen.ItemAnimator
– Definiert die Animationen, die während der Elementaktionen oder als Änderungen am Adapter ausgeführt werden.
Die Beziehung zwischen den RecyclerView
Klassen , LayoutManager
und Adapter
ist im folgenden Diagramm dargestellt:
Wie diese Abbildung veranschaulicht, LayoutManager
kann als Vermittler zwischen und Adapter
RecyclerView
betrachtet werden. Führt LayoutManager
Aufrufe von Adapter
-Methoden im Namen von durch RecyclerView
. Ruft beispielsweise eine Adapter
-Methode auf, wenn es an der Zeit ist, LayoutManager
eine neue Ansicht für eine bestimmte Elementposition im RecyclerView
zu erstellen. Das Adapter
vergrößert das Layout für dieses Element und erstellt eine ViewHolder
instance (nicht angezeigt), um Verweise auf die Ansichten an dieser Position zwischenzuspeichern. Wenn der LayoutManager
aufruft Adapter
, um ein bestimmtes Element an das Dataset zu binden, sucht die Adapter
Daten für dieses Element, ruft sie aus dem Dataset ab und kopiert sie in die zugeordnete Elementansicht.
Wenn Sie in Ihrer App verwenden RecyclerView
, ist das Erstellen abgeleiteter Typen der folgenden Klassen erforderlich:
RecyclerView.Adapter
– Stellt eine Bindung aus dem Dataset Ihrer App (die für Ihre App spezifisch ist) für Elementansichten bereit, die in angezeigtRecyclerView
werden. Der Adapter weiß, wie jede Elementansichtsposition imRecyclerView
einem bestimmten Speicherort in der Datenquelle zugeordnet werden kann. Darüber hinaus verarbeitet der Adapter das Layout der Inhalte in jeder einzelnen Elementansicht und erstellt den Ansichtshalter für jede Ansicht. Der Adapter meldet auch Item-Click-Ereignisse, die von der Elementansicht erkannt werden.RecyclerView.ViewHolder
– Speichert Verweise auf die Ansichten in der Elementlayoutdatei zwischen, sodass Ressourcensuchvorgänge nicht unnötig wiederholt werden. Der Ansichtshalter sorgt auch dafür, dass Item-Click-Ereignisse an den Adapter weitergeleitet werden, wenn ein Benutzer auf die zugeordnete Elementansicht des Ansichtsinhabers tippt.RecyclerView.LayoutManager
– Positioniert Elemente innerhalb vonRecyclerView
. Sie können einen von mehreren vordefinierten Layout-Managern verwenden oder einen eigenen benutzerdefinierten Layout-Manager implementieren.RecyclerView
delegiert die Layoutrichtlinie an den Layout-Manager, sodass Sie einen anderen Layout-Manager anschließen können, ohne wesentliche Änderungen an Ihrer App vornehmen zu müssen.
Außerdem können Sie optional die folgenden Klassen erweitern, um das Aussehen und Verhalten von RecyclerView
in Ihrer App zu ändern:
RecyclerView.ItemDecoration
RecyclerView.ItemAnimator
Wenn Sie und ItemAnimator
nicht erweiternItemDecoration
, RecyclerView
werden Standardimplementierungen verwendet. In diesem Leitfaden wird nicht erläutert, wie Sie benutzerdefinierte ItemDecoration
Klassen und ItemAnimator
Klassen erstellen. Weitere Informationen zu diesen Klassen finden Sie unter RecyclerView.ItemDecoration und RecyclerView.ItemAnimator.
Funktionsweise des Ansichtsrecyclings
RecyclerView
weist nicht für jedes Element in Ihrer Datenquelle eine Elementansicht zu. Stattdessen wird nur die Anzahl der Elementansichten zugeordnet, die auf den Bildschirm passen, und diese Elementlayouts werden beim Scrollen des Benutzers wiederverwendet. Wenn die Ansicht zum ersten Mal außer Sichtweite scrollt, durchläuft sie den in der folgenden Abbildung dargestellten Recyclingprozess:
Wenn eine Ansicht außerhalb des Sichtfelds scrollt und nicht mehr angezeigt wird, wird sie zu einer Ausschussansicht.
Die Ausschussansicht wird in einem Pool platziert und zu einer Recyclingansicht. Bei diesem Pool handelt es sich um einen Cache von Ansichten, die denselben Datentyp anzeigen.
Wenn ein neues Element angezeigt werden soll, wird eine Ansicht aus dem Recyclingpool zur Wiederverwendung übernommen. Da diese Ansicht vor der Anzeige erneut vom Adapter gebunden werden muss, wird sie als modifiziert-Ansicht bezeichnet.
Die modifiziert Ansicht wird wiederverwendet: Der Adapter sucht die Daten für das nächste anzuzeigende Element und kopiert diese Daten in die Ansichten für dieses Element. Verweise für diese Ansichten werden aus dem Ansichtshalter abgerufen, der der wiederverwendeten Ansicht zugeordnet ist.
Die wiederverwendete Ansicht wird der Liste der Elemente in der hinzugefügt, die auf dem
RecyclerView
Bildschirm angezeigt werden.Die wiederverwendete Ansicht wird auf dem Bildschirm angezeigt, während der Benutzer zum nächsten Element in der Liste scrollt
RecyclerView
. In der Zwischenzeit scrollt eine andere Ansicht außerhalb der Sicht und wird gemäß den oben genannten Schritten wiederverwendet.
Zusätzlich zur Wiederverwendung RecyclerView
von Elementansichten verwendet auch eine weitere Effizienzoptimierung: Ansichtshalter. Ein Ansichtshalter ist eine einfache Klasse, die Ansichtsverweise zwischenspeichert. Jedes Mal, wenn der Adapter eine Elementlayoutdatei auffüllt, erstellt er auch einen entsprechenden Ansichtshalter. Der Ansichtshalter verwendet FindViewById
, um Verweise auf die Ansichten in der aufgeblasenen Elementlayoutdatei abzurufen. Diese Verweise werden verwendet, um neue Daten in die Ansichten zu laden, jedes Mal, wenn das Layout wiederverwendet wird, um neue Daten anzuzeigen.
Layout-Manager
Der Layout-Manager ist für die Positionierung von Elementen in der RecyclerView
Anzeige zuständig. Er bestimmt den Präsentationstyp (eine Liste oder ein Raster), die Ausrichtung (ob Elemente vertikal oder horizontal angezeigt werden) und welche Richtung Elemente angezeigt werden sollen (in normaler oder umgekehrter Reihenfolge). Der Layout-Manager ist auch für die Berechnung der Größe und Position jedes Elements in der RecycleView-Anzeige verantwortlich.
Der Layout-Manager hat einen zusätzlichen Zweck: Er bestimmt die Richtlinie, wann Elementansichten wiederverwendet werden sollen, die für den Benutzer nicht mehr sichtbar sind. Da der Layout-Manager weiß, welche Ansichten sichtbar sind (und welche nicht), kann er am besten entscheiden, wann eine Ansicht wiederverwendet werden kann. Um eine Ansicht wiederzuverwenden, ruft der Layout-Manager in der Regel den Adapter auf, um den Inhalt einer wiederverwendeten Ansicht durch andere Daten zu ersetzen, wie zuvor in How View Recycling Works beschrieben.
Sie können erweitern RecyclerView.LayoutManager
, um Einen eigenen Layout-Manager zu erstellen, oder Sie können einen vordefinierten Layout-Manager verwenden.
RecyclerView
stellt die folgenden vordefinierten Layout-Manager bereit:
LinearLayoutManager
– Ordnet Elemente in einer Spalte an, die vertikal gescrollt werden kann, oder in einer Zeile, die horizontal gescrollt werden kann.GridLayoutManager
– Zeigt Elemente in einem Raster an.StaggeredGridLayoutManager
– Zeigt Elemente in einem gestaffelten Raster an, in dem einige Elemente unterschiedliche Höhen und Breiten aufweisen.
Um den Layout-Manager anzugeben, instanziieren Sie den ausgewählten Layout-Manager, und übergeben Sie ihn an die SetLayoutManager
-Methode. Beachten Sie, dass Sie den Layout-Manager angeben müssen – RecyclerView
wählt standardmäßig keinen vordefinierten Layout-Manager aus.
Weitere Informationen zum Layout-Manager finden Sie in der Referenz zur RecyclerView.LayoutManager-Klasse.
Der Ansichtshalter
Der Ansichtshalter ist eine Klasse, die Sie zum Zwischenspeichern von Ansichtsverweisen definieren. Der Adapter verwendet diese Ansichtsverweise, um jede Ansicht an ihren Inhalt zu binden. Jedes Element in verfügt über einen zugeordneten RecyclerView
Ansichtshalter instance, der die Ansichtsverweise für dieses Element zwischenspeichert. Führen Sie zum Erstellen eines Ansichtshalters die folgenden Schritte aus, um eine Klasse zu definieren, die den genauen Satz von Ansichten pro Element enthält:
- Unterklasse
RecyclerView.ViewHolder
. - Implementieren Sie einen Konstruktor, der die Ansichtsverweise sucht und speichert.
- Implementieren Sie Eigenschaften, die der Adapter für den Zugriff auf diese Verweise verwenden kann.
Ein ausführliches Beispiel für eine ViewHolder
Implementierung finden Sie unter Ein einfaches RecyclerView-Beispiel.
Weitere Informationen zu RecyclerView.ViewHolder
finden Sie in der Referenz zur RecyclerView.ViewHolder-Klasse.
Der Adapter
Der größte Teil des "Schwerlasten" des RecyclerView
Integrationscodes findet im Adapter statt.
RecyclerView
erfordert, dass Sie einen Adapter bereitstellen, der von abgeleitet wird RecyclerView.Adapter
, um auf Ihre Datenquelle zuzugreifen und jedes Element mit Inhalten aus der Datenquelle aufzufüllen.
Da die Datenquelle appspezifisch ist, müssen Sie Adapterfunktionen implementieren, die den Zugriff auf Ihre Daten verstehen. Der Adapter extrahiert Informationen aus der Datenquelle und lädt sie in jedes Element in der RecyclerView
Auflistung.
Die folgende Zeichnung veranschaulicht, wie der Adapter Inhalte in einer Datenquelle über Ansichtshalter einzelnen Ansichten innerhalb jedes Zeilenelements im RecyclerView
zuordnet:
Der Adapter lädt jede RecyclerView
Zeile mit Daten für ein bestimmtes Zeilenelement. Für Zeilenposition P sucht der Adapter beispielsweise die zugeordneten Daten an Position P innerhalb der Datenquelle und kopiert diese Daten in das Zeilenelement an Position P in der RecyclerView
Auflistung.
In der obigen Zeichnung verwendet der Adapter beispielsweise den Ansichtshalter, um die Verweise für und ImageView
TextView
an dieser Position zu suchen, sodass er diese Ansichten nicht wiederholt aufrufen FindViewById
muss, während der Benutzer durch die Sammlung scrollt und Ansichten wiederverwendet.
Wenn Sie einen Adapter implementieren, müssen Sie die folgenden RecyclerView.Adapter
Methoden außer Kraft setzen:
OnCreateViewHolder
– Instanziiert die Elementlayoutdatei und den Ansichtshalter.OnBindViewHolder
– Lädt die Daten an der angegebenen Position in die Ansichten, deren Verweise im angegebenen Ansichtshalter gespeichert sind.ItemCount
– Gibt die Anzahl der Elemente in der Datenquelle zurück.
Der Layout-Manager ruft diese Methoden auf, während elemente innerhalb des RecyclerView
positioniert werden.
Benachrichtigen von RecyclerView bei Datenänderungen
RecyclerView
aktualisiert die Anzeige nicht automatisch, wenn sich der Inhalt der Datenquelle ändert; Der Adapter muss benachrichtigen RecyclerView
, wenn eine Änderung im Dataset vorliegt. Das Dataset kann sich in vielerlei Hinsicht ändern. beispielsweise kann sich der Inhalt in einem Element ändern oder die Gesamtstruktur der Daten geändert werden.
RecyclerView.Adapter
stellt eine Reihe von Methoden bereit, die Sie aufrufen können, RecyclerView
um auf Datenänderungen auf die effizienteste Weise zu reagieren:
NotifyItemChanged
– Signalisiert, dass sich das Element an der angegebenen Position geändert hat.NotifyItemRangeChanged
– Signalisiert, dass sich die Elemente im angegebenen Positionsbereich geändert haben.NotifyItemInserted
– Signalisiert, dass das Element an der angegebenen Position neu eingefügt wurde.NotifyItemRangeInserted
– Signalisiert, dass die Elemente im angegebenen Positionsbereich neu eingefügt wurden.NotifyItemRemoved
– Signalisiert, dass das Element an der angegebenen Position entfernt wurde.NotifyItemRangeRemoved
– Signal, dass die Elemente im angegebenen Bereich von Positionen entfernt wurden.NotifyDataSetChanged
– Signalisiert, dass sich das Dataset geändert hat (erzwingt eine vollständige Aktualisierung).
Wenn Sie genau wissen, wie sich Ihr Dataset geändert hat, können Sie die oben angegebenen Methoden aufrufen, um die aktualisierung auf die effizienteste Weise zu RecyclerView
erreichen. Wenn Sie nicht genau wissen, wie sich Ihr Dataset geändert hat, können Sie aufrufen NotifyDataSetChanged
, was viel weniger effizient ist, da RecyclerView
alle Ansichten aktualisiert werden müssen, die für den Benutzer sichtbar sind. Weitere Informationen zu diesen Methoden finden Sie unter RecyclerView.Adapter.
Im nächsten Thema, A Basic RecyclerView Example, wird eine Beispiel-App implementiert, um echte Codebeispiele der oben beschriebenen Teile und Funktionen zu veranschaulichen.