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 obiekcieRecyclerView
. Karta zgłasza również zdarzenia kliknięcia elementu.LayoutManager
— Mierzy i umieszcza widoki elementów w obrębie elementuRecyclerView
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
, LayoutManager
i Adapter
jest przedstawiona na poniższym diagramie:
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 obiekcieRecyclerView
. Karta wie, jak skojarzyć poszczególne pozycje widoku elementów zRecyclerView
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 obiekcieRecyclerView
. 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:
Gdy widok przewija się z widoku i nie jest już wyświetlany, staje się widokiem złomu.
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.
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.
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.
Widok z recyklingu jest dodawany do listy elementów znajdujących się na
RecyclerView
ekranie.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:
- Podklasa
RecyclerView.ViewHolder
. - Zaimplementuj konstruktor, który wyszukuje i przechowuje odwołania do widoku.
- 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.ViewHolder
klasy , 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
:
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ć NotifyDataSetChanged
metodę , 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.