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 einem RecyclerViewangezeigt werden. Der Adapter meldet auch Item-Click-Ereignisse.

  • LayoutManager – Misst und positioniert Elementansichten in einem RecyclerView 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 RecyclerViewKlassen , LayoutManagerund Adapter ist im folgenden Diagramm dargestellt:

Diagramm von RecyclerView mit LayoutManager und Verwendung des Adapters für den Zugriff auf Das Dataset

Wie diese Abbildung veranschaulicht, LayoutManager kann als Vermittler zwischen und AdapterRecyclerViewbetrachtet 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 RecyclerViewzu 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 angezeigt RecyclerViewwerden. Der Adapter weiß, wie jede Elementansichtsposition im RecyclerView 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 von RecyclerView. 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 ItemAnimatornicht 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:

Diagramm zur Veranschaulichung der sechs Schritte des Ansichtsrecyclings

  1. Wenn eine Ansicht außerhalb des Sichtfelds scrollt und nicht mehr angezeigt wird, wird sie zu einer Ausschussansicht.

  2. 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.

  3. 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.

  4. 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.

  5. Die wiederverwendete Ansicht wird der Liste der Elemente in der hinzugefügt, die auf dem RecyclerView Bildschirm angezeigt werden.

  6. 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üssenRecyclerView 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:

  1. Unterklasse RecyclerView.ViewHolder.
  2. Implementieren Sie einen Konstruktor, der die Ansichtsverweise sucht und speichert.
  3. 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.ViewHolderfinden 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 RecyclerViewzuordnet:

Diagramm zur Veranschaulichung des Adapters, der die Datenquelle mit ViewHolders verbindet

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 ImageViewTextView 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 RecyclerViewpositioniert 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.