Udostępnij za pośrednictwem


RecyclerView — części i funkcje

RecyclerView obsługuje niektóre zadania wewnętrznie (takie jak przewijanie i odtwarzanie widoków), ale zasadniczo menedżer koordynuje klasy pomocnicze do wyświetlania kolekcji. RecyclerView deleguje zadania do następujących klas pomocników:

  • Adapter — Zawyża układy elementów (tworzy wystąpienie zawartości pliku układu) i wiąże dane z widokami wyświetlanymi w obiekcie RecyclerView. Karta zgłasza również zdarzenia kliknięcia elementu.

  • LayoutManager — Mierzy i umieszcza widoki elementów w obrębie elementu RecyclerView i zarządza zasadami dotyczącymi wyświetlania recyklingu.

  • ViewHolder — wyszukuje i przechowuje odwołania do widoku. Uchwyt widoku pomaga również wykrywać kliknięcia widoku elementu.

  • ItemDecoration — umożliwia aplikacji dodawanie specjalnych przesunięć rysunku i układu do określonych widoków dla rozdzielaczy rysunku między elementami, wyróżnieniami i granicami grupowania wizualizacji.

  • ItemAnimator — definiuje animacje, które mają miejsce podczas akcji elementu lub w miarę wprowadzania zmian w adapterze.

Relacja między klasami RecyclerView, LayoutManageri Adapter jest przedstawiona na poniższym diagramie:

Diagram of RecyclerView containing LayoutManager, using Adapter to access Data Set

Jak pokazano na rysunku, LayoutManager można traktować jako pośrednika między elementami Adapter i RecyclerView. Funkcja LayoutManager wykonuje wywołania metod w Adapter imieniu obiektu RecyclerView. Na przykład metoda LayoutManager wywołuje metodę Adapter , gdy nadszedł czas, aby utworzyć nowy widok dla określonej pozycji elementu w elemencie RecyclerView. Zawyża Adapter układ dla tego elementu i tworzy ViewHolder wystąpienie (nie pokazane) w celu buforowania odwołań do widoków znajdujących się na tej pozycji. Gdy wywołanie LayoutManager Adapter elementu w celu powiązania określonego elementu z zestawem danych, Adapter lokalizuje dane dla tego elementu, pobiera je z zestawu danych i kopiuje go do skojarzonego widoku elementu.

W przypadku korzystania z RecyclerView aplikacji wymagane jest utworzenie typów pochodnych następujących klas:

  • RecyclerView.Adapter — Udostępnia powiązanie z zestawu danych aplikacji (które jest specyficzne dla aplikacji) do widoków elementów wyświetlanych w obiekcie RecyclerView. Karta wie, jak skojarzyć poszczególne pozycje widoku elementów z RecyclerView określoną lokalizacją w źródle danych. Ponadto karta obsługuje układ zawartości w każdym widoku poszczególnych elementów i tworzy uchwyt widoku dla każdego widoku. Karta zgłasza również zdarzenia kliknięcia elementu, które są wykrywane przez widok elementu.

  • RecyclerView.ViewHolder — Buforuje odwołania do widoków w pliku układu elementu, aby wyszukiwanie zasobów nie było niepotrzebnie powtarzane. Uchwyt widoku organizuje również zdarzenia kliknięcia elementu, które mają być przekazywane do karty, gdy użytkownik naciągnie skojarzony z nim widok widoku.

  • RecyclerView.LayoutManager — pozycje elementów w obiekcie RecyclerView. Możesz użyć jednego z kilku wstępnie zdefiniowanych menedżerów układów lub zaimplementować własnego niestandardowego menedżera układów. RecyclerView deleguje zasady układu do menedżera układów, dzięki czemu można podłączyć innego menedżera układów bez konieczności wprowadzania znaczących zmian w aplikacji.

Ponadto możesz opcjonalnie rozszerzyć następujące klasy, aby zmienić wygląd i działanie RecyclerView aplikacji:

  • RecyclerView.ItemDecoration
  • RecyclerView.ItemAnimator

Jeśli nie rozszerzysz ItemDecoration polecenia i ItemAnimator, RecyclerView użyje domyślnych implementacji. Ten przewodnik nie wyjaśnia sposobu tworzenia klas niestandardowych ItemDecoration i ItemAnimator . Aby uzyskać więcej informacji na temat tych klas, zobacz RecyclerView.ItemDecoration i RecyclerView.ItemAnimator.

Jak działa odtwarzanie widoku

RecyclerView nie przydziela widoku elementu dla każdego elementu w źródle danych. Zamiast tego przydziela tylko liczbę widoków elementów, które mieszczą się na ekranie, i ponownie używa tych układów elementów podczas przewijania użytkownika. Gdy widok po raz pierwszy przewija się poza zasięgiem wzroku, przechodzi przez proces recyklingu przedstawiony na poniższej ilustracji:

Diagram illustrating the six steps of view recycling

  1. Gdy widok przewija się z widoku i nie jest już wyświetlany, staje się widokiem złomu.

  2. Widok złomu znajduje się w basenie i staje się widokiem recyklingu. Ta pula jest pamięcią podręczną widoków, które wyświetlają ten sam typ danych.

  3. Gdy nowy element ma być wyświetlany, widok jest pobierany z puli recyklingu do ponownego użycia. Ponieważ ten widok musi zostać ponownie powiązany przez kartę przed wyświetleniem, jest nazywany zanieczyszczonym widokiem.

  4. Zanieczyszczony widok jest odzyskiwanych: adapter lokalizuje dane dla następnego elementu do wyświetlenia i kopiuje te dane do widoków dla tego elementu. Odwołania do tych widoków są pobierane z uchwytu widoku skojarzonego z widokiem z recyklingu.

  5. Widok z recyklingu jest dodawany do listy elementów znajdujących się na RecyclerView ekranie.

  6. Widok z recyklingu jest wyświetlany na ekranie, gdy użytkownik przewija RecyclerView element do następnego elementu na liście. Tymczasem inny widok przewija się poza zasięgiem wzroku i jest poddawany recyklingu zgodnie z powyższymi krokami.

Oprócz ponownego użycia widoku elementów, RecyclerView używa również innej optymalizacji wydajności: posiadaczy widoków. Uchwyt widoku jest prostą klasą, która buforuje odwołania do widoku. Za każdym razem, gdy adapter zawyża plik układu elementu, tworzy również odpowiedni uchwyt widoku. Uchwyt widoku używa FindViewById do pobierania odwołań do widoków wewnątrz zawyżonego pliku układu elementu. Te odwołania są używane do ładowania nowych danych do widoków za każdym razem, gdy układ jest odzyskiwanych w celu wyświetlania nowych danych.

Menedżer układów

Menedżer układu jest odpowiedzialny za pozycjonowanie elementów na wyświetlaczu RecyclerView ; określa typ prezentacji (listę lub siatkę), orientację (elementy są wyświetlane w pionie lub w poziomie) i które elementy kierunku powinny być wyświetlane (w normalnej kolejności lub w odwrotnej kolejności). Menedżer układu jest również odpowiedzialny za obliczanie rozmiaru i położenia każdego elementu na ekranie RecycleView .

Menedżer układów ma dodatkowy cel: określa zasady, dla których mają być odtwarzane widoki elementów, które nie są już widoczne dla użytkownika. Ponieważ menedżer układu zdaje sobie sprawę, które widoki są widoczne (i które nie), jest w najlepszej sytuacji, aby zdecydować, kiedy widok może zostać poddany recyklingu. Aby odzyskać widok, menedżer układu zwykle wykonuje wywołania adaptera w celu zastąpienia zawartości widoku recyklingu różnymi danymi, jak opisano wcześniej w temacie Jak działa odtwarzanie widoku.

Można rozszerzyć RecyclerView.LayoutManager w celu utworzenia własnego menedżera układów lub użyć wstępnie zdefiniowanego menedżera układów. RecyclerView udostępnia następujące wstępnie zdefiniowane menedżery układów:

  • LinearLayoutManager — Rozmieszcza elementy w kolumnie, którą można przewijać w pionie lub w wierszu, który można przewijać w poziomie.

  • GridLayoutManager — wyświetla elementy w siatce.

  • StaggeredGridLayoutManager — wyświetla elementy w siatce rozłożonej, gdzie niektóre elementy mają różne wysokości i szerokości.

Aby określić menedżera układów, utwórz wystąpienie wybranego menedżera układów i przekaż go do SetLayoutManager metody . Należy pamiętać, że należy określić menedżera układów — RecyclerView domyślnie nie wybiera wstępnie zdefiniowanego menedżera układów.

Aby uzyskać więcej informacji na temat menedżera układów, zobacz dokumentację klasy RecyclerView.LayoutManager.

Uchwyt widoku

Uchwyt widoku jest klasą zdefiniowaną dla odwołań do widoku buforowania. Karta używa tych odwołań do widoku, aby powiązać każdy widok z jego zawartością. Każdy element w obiekcie RecyclerView ma skojarzone wystąpienie właściciela widoku, które buforuje odwołania do widoku dla tego elementu. Aby utworzyć uchwyt widoku, wykonaj następujące kroki, aby zdefiniować klasę do przechowywania dokładnego zestawu widoków na element:

  1. Podklasa RecyclerView.ViewHolder.
  2. Zaimplementuj konstruktor, który wyszukuje i przechowuje odwołania do widoku.
  3. Zaimplementuj właściwości, których karta może używać do uzyskiwania dostępu do tych odwołań.

Szczegółowy przykład implementacji ViewHolder przedstawiono w przykładzie Podstawowe recyclerView. Aby uzyskać więcej informacji na temat RecyclerView.ViewHolderklasy , zobacz dokumentację klasy RecyclerView.ViewHolder.

The Adapter

Większość "ciężkich RecyclerView " kodu integracji odbywa się w adapterze. RecyclerView wymaga podania karty pochodzącej z RecyclerView.Adapter programu w celu uzyskania dostępu do źródła danych i wypełnienia każdego elementu zawartością ze źródła danych. Ponieważ źródło danych jest specyficzne dla aplikacji, należy zaimplementować funkcję karty, która rozumie, jak uzyskiwać dostęp do danych. Karta wyodrębnia informacje ze źródła danych i ładuje je do każdego elementu w kolekcji RecyclerView .

Na poniższym rysunku pokazano, jak karta mapuje zawartość w źródle danych za pomocą uchwytów widoku do poszczególnych widoków w każdym elemencie wiersza w elemencie RecyclerView:

Diagram illustrating Adapter connecting Data Source to ViewHolders

Karta ładuje każdy RecyclerView wiersz z danymi dla określonego elementu wiersza. Na przykład w przypadku pozycji wiersza P karta lokalizuje skojarzone dane w pozycji P w źródle danych i kopiuje te dane do elementu wiersza na pozycji P w RecyclerView kolekcji. Na powyższym rysunku na przykład adapter używa uchwytu widoku do wyszukiwania odwołań dla ImageView elementu i TextView w tej pozycji, więc nie musi wielokrotnie wywoływać FindViewById tych widoków, gdy użytkownik przewija kolekcję i ponownie używa widoków.

Podczas implementowania karty należy zastąpić następujące RecyclerView.Adapter metody:

  • OnCreateViewHolder — tworzy wystąpienie pliku układu elementu i uchwyt widoku.

  • OnBindViewHolder — Ładuje dane na określonej pozycji do widoków, których odwołania są przechowywane w danym posiadaczu widoku.

  • ItemCount — zwraca liczbę elementów w źródle danych.

Menedżer układów wywołuje te metody, gdy pozycjonuje elementy w obiekcie RecyclerView.

Powiadamianie recyclerView zmian danych

RecyclerView nie powoduje automatycznej aktualizacji jego wyświetlania, gdy zawartość źródła danych ulegnie zmianie; adapter musi powiadamiać RecyclerView o zmianie zestawu danych. Zestaw danych może ulec zmianie na wiele sposobów; na przykład zawartość elementu może ulec zmianie lub zmienić ogólną strukturę danych. RecyclerView.Adapter Udostępnia szereg metod, które można wywołać, aby RecyclerView reagować na zmiany danych w najbardziej wydajny sposób:

  • NotifyItemChanged — Sygnały, że element na określonej pozycji uległ zmianie.

  • NotifyItemRangeChanged – Sygnały, że elementy w określonym zakresie pozycji uległy zmianie.

  • NotifyItemInserted — Sygnały, że element w określonej pozycji został nowo wstawiony.

  • NotifyItemRangeInserted – Sygnały, że elementy w określonym zakresie pozycji zostały nowo wstawione.

  • NotifyItemRemoved — Sygnały, że element w określonej pozycji został usunięty.

  • NotifyItemRangeRemoved – Sygnały, że elementy w określonym zakresie pozycji zostały usunięte.

  • NotifyDataSetChanged — Sygnały zmiany zestawu danych (wymusza pełną aktualizację).

Jeśli wiesz dokładnie, jak zmienił się zestaw danych, możesz wywołać odpowiednie metody powyżej, aby odświeżyć RecyclerView w najbardziej wydajny sposób. Jeśli nie wiesz dokładnie, jak zmienił się zestaw danych, możesz wywołać NotifyDataSetChangedmetodę , która jest znacznie mniej wydajna, ponieważ RecyclerView musi odświeżyć wszystkie widoki widoczne dla użytkownika. Aby uzyskać więcej informacji na temat tych metod, zobacz RecyclerView.Adapter.

W następnym temacie przykład podstawowy recyclerView przykładowa aplikacja jest implementowana w celu zademonstrowania rzeczywistych przykładów kodu części i funkcji opisanych powyżej.