Dostosowywanie listy dynamicznej Należy do Jetpacka na Androida.
Obiekty RecyclerView
możesz dostosowywać do swoich potrzeb. Standardowe klasy opisane w artykule Tworzenie dynamicznych list za pomocą RecyclerView zapewniają wszystkie funkcje, których potrzebuje większość programistów. W wielu przypadkach wystarczy zaprojektować widok dla każdego elementu widoku i napisać kod, który zaktualizuje te widoki odpowiednimi danymi. Jeśli jednak Twoja aplikacja ma określone wymagania, możesz zmodyfikować standardowe działanie na kilka sposobów.
W tym dokumencie opisujemy niektóre możliwe opcje dostosowywania.
Modyfikowanie układu
RecyclerView
używa menedżera układu do umieszczania poszczególnych elementów na ekranie i określania, kiedy można ponownie użyć widoków elementów, które nie są już widoczne dla użytkownika. Aby ponownie użyć (czyli przetworzyć) widok, menedżer układu może poprosić adapter o zastąpienie zawartości widoku innym elementem z zbioru danych. Takie odzyskiwanie widoków poprawia wydajność, ponieważ zapobiega tworzeniu niepotrzebnych widoków i drogim zapytaniomfindViewById()
. Biblioteka Android Support Library zawiera 3 standardowe menedżery układu, z których każdy oferuje wiele opcji dostosowywania:
LinearLayoutManager
: sortuje elementy w liście jednowymiarowej. UżycieRecyclerView
zLinearLayoutManager
zapewnia funkcjonalność podobną do układuListView
.GridLayoutManager
: układa elementy w dwujęzycznej siatce, jak pola na szachownicy. UżycieRecyclerView
zGridLayoutManager
zapewnia funkcjonalność podobną do układuGridView
.StaggeredGridLayoutManager
: układa elementy w dwudwumiarowej siatce, przy czym każda kolumna jest nieco przesunięta w stosunku do poprzedniej, jak gwiazdy na fladze Stanów Zjednoczonych.
Jeśli te menedżery układu nie spełniają Twoich wymagań, możesz utworzyć własnego, rozszerzając abstrakcyjną klasę RecyclerView.LayoutManager
.
Dodawanie animacji elementów
Gdy element się zmienia, RecyclerView
używa animatora, aby zmienić jego wygląd. Ten animator jest obiektem, który rozszerza abstrakcyjną klasę RecyclerView.ItemAnimator
. Domyślnie RecyclerView
używa DefaultItemAnimator
do wyświetlania animacji. Jeśli chcesz udostępnić animacje niestandardowe, możesz zdefiniować własny obiekt animatora, rozszerzając klasę RecyclerView.ItemAnimator
.
Włączanie wyboru pozycji na liście
Biblioteka recyclerview-selection
pozwala użytkownikom wybierać elementy na liście RecyclerView
za pomocą ekranu dotykowego lub myszy. Dzięki temu możesz zachować kontrolę nad wizualną prezentacją wybranego elementu. Możesz też zachować kontrolę nad zasadami regulującymi sposób wyboru, na przykład które elementy są kwalifikowane do wyboru i ile elementów można wybrać.
Aby dodać obsługę wyboru do instancji RecyclerView
, wykonaj te czynności:
- Zdecyduj, którego typu klucza wyboru użyć, a następnie utwórz
ItemKeyProvider
.Do identyfikowania wybranych elementów możesz używać 3 rodzajów kluczy:
Parcelable
oraz jego podklasy, takie jakUri
String
Long
Szczegółowe informacje o typach kluczy wyboru znajdziesz w artykule
SelectionTracker.Builder
. - Wdróż
ItemDetailsLookup
. - Zaktualizuj obiekty
View
w elementachRecyclerView
, aby odzwierciedlić, czy użytkownik je wybrał, czy odznaczył.Biblioteka elementów nie zawiera domyślnej dekoracji wizualnej dla wybranych elementów. Podaj te informacje podczas implementacji.
onBindViewHolder()
Zalecamy następujące podejście:- W funkcji
onBindViewHolder()
wywołaj funkcjęsetActivated()
—niesetSelected()
—na obiekcieView
za pomocą funkcjitrue
lubfalse
, w zależności od tego, czy element jest wybrany. - Zaktualizuj styl widoku, aby odzwierciedlał stan aktywacji. Zalecamy użycie zasobu listy stanów kolorów do skonfigurowania stylizacji.
- W funkcji
- Użyj elementu
ActionMode
, aby udostępnić użytkownikowi narzędzia do wykonania działania na zaznaczonym elemencie. - wykonywać interpretowane działania dodatkowe.
- Zmontuj wszystko za pomocą
SelectionTracker.Builder
. - uwzględnić wybór w zdarzeniach cyklu życia aktywności;
ItemDetailsLookup
pozwala bibliotece wyboru uzyskać dostęp do informacji o elementach RecyclerView
pod warunkiem, że MotionEvent
.
Jest to fabryka instancji ItemDetails
, które są kopiami zapasowymi lub wyodrębnieniami instancji RecyclerView.ViewHolder
.
Zarejestruj się
SelectionTracker.SelectionObserver
aby otrzymywać powiadomienia o zmianach w wyborze. Gdy po raz pierwszy zostanie utworzony wybór,ActionMode
zacznij prezentować go użytkownikowi i zapewniaj mu możliwość wykonywania działań związanych z wyborem. Możesz na przykład dodać do paska ActionMode
przycisk usuwania i połączyć go z strzałką wstecz, aby anulować wybór. Gdy wybór stanie się pusty (czyli użytkownik wyczyścił go ostatni raz), zakończ tryb działania.
Na końcu potoku przetwarzania zdarzeń biblioteka może stwierdzić, że użytkownik próbuje aktywować element, klikając go, lub próbuje przeciągnąć element lub zestaw wybranych elementów. Reaguj na te interpretacje, rejestrując odpowiednich słuchaczy. Więcej informacji znajdziesz na stronie SelectionTracker.Builder
.
Ten przykład pokazuje, jak połączyć te elementy:
Kotlin
var tracker = SelectionTracker.Builder( "my-selection-id", recyclerView, StableIdKeyProvider(recyclerView), MyDetailsLookup(recyclerView), StorageStrategy.createLongStorage()) .withOnItemActivatedListener(myItemActivatedListener) .build()
Java
SelectionTracker tracker = new SelectionTracker.Builder<>( "my-selection-id", recyclerView, new StableIdKeyProvider(recyclerView), new MyDetailsLookup(recyclerView), StorageStrategy.createLongStorage()) .withOnItemActivatedListener(myItemActivatedListener) .build();
Aby utworzyć instancję
SelectionTracker
, aplikacja musi podać ten sam
RecyclerView.Adapter
, którego używasz do inicjowania RecyclerView
na potrzeby SelectionTracker.Builder
. Dlatego po utworzeniu instancjiSelectionTracker
wstrzyknij ją do funkcjiRecyclerView.Adapter
. W przeciwnym razie nie możesz sprawdzić stanu wybranego elementu za pomocą metody onBindViewHolder()
.
Aby zachować stan wyboru w zdarzeniu cyklu życia aktywności, aplikacja musi wywołać metody onSaveInstanceState()
i onRestoreInstanceState()
śledzącego wyboru z metod onSaveInstanceState()
i onRestoreInstanceState()
aktywności. Aplikacja musi też podać unikalny identyfikator wyboru konstruktorowi SelectionTracker.Builder
. Ten identyfikator jest wymagany, ponieważ aktywność lub fragment może mieć więcej niż jedną odrębną listę do wyboru, a wszystkie z nich muszą być zapisywane w zapisanym stanie.
Dodatkowe materiały
Więcej informacji znajdziesz w tych materiałach:
- aplikacji demonstracyjnej Sunflower, która korzysta z
RecyclerView
. - Używanie RecyclerView do wyświetlania listy przewijanej – Codelab.
- Android Kotlin Fundamentals: RecyclerView fundamentals (podstawy Kotlina: podstawy RecyclerView) – Codelab.