Dostosowywanie listy dynamicznej Element Jetpacka na Androida.
Możesz dostosować RecyclerView
obiektów 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 dostosowania.
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ć lub 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 wyszukiwaniom.findViewById()
Biblioteka Android Support Library zawiera 3 standardowe menedżery układu, z których każdy oferuje wiele opcji dostosowywania:
LinearLayoutManager
: uporządkuje elementy na jednowymiarowej liście. UżycieRecyclerView
zLinearLayoutManager
zapewnia funkcjonalność podobną do układuListView
.GridLayoutManager
: układa elementy w dwujęzycznej siatce, tak jak pola na szachownicy. Użycie właściwościRecyclerView
zGridLayoutManager
zapewnia takie funkcje jak układGridView
.StaggeredGridLayoutManager
: układa elementy w dwudwumiarowej siatce, przy czym każda kolumna jest nieco przesunięta względem 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
.
Dodaj animacje 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 wygenerowania 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
umożliwia użytkownikom wybieranie elementów z listy RecyclerView
za pomocą dotyku lub myszy. Dzięki temu masz kontrolę nad wizualną prezentacją wybranego elementu. Możesz też zachować kontrolę nad zasadami regulującymi zachowanie podczas wyboru, na przykład które elementy można wybrać 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
i jej podklasy, takie jakUri
String
Long
Szczegółowe informacje o typach kluczy wyboru znajdziesz w artykule
SelectionTracker.Builder
. - Wdróż
ItemDetailsLookup
. - Zaktualizuj obiekty
View
elementu wRecyclerView
, aby określić, czy użytkownik je zaznacza czy odznacza.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, tak aby odzwierciedlał stan aktywacji. Zalecamy użycie zasobu listy stanów kolorów do skonfigurowania stylizacji.
- W funkcji
- Użyj
ActionMode
, aby udostępnić użytkownikowi narzędzia do wykonania działania na zaznaczonym elemencie. - Wykonaj dowolne zinterpretowane działania dodatkowe.
- Zmontuj wszystko za pomocą narzędzia
SelectionTracker.Builder
. - uwzględnić wybór w zdarzeniach cyklu życia aktywności;
ItemDetailsLookup
umożliwia bibliotece wyboru informacje o elementach RecyclerView
z określoną wartością 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 przez jego kliknięcie lub próbuje przeciągnąć element lub zestaw wybranych elementów. Aby reagować na te interpretacje, zarejestruj odpowiedniego detektora. Więcej informacji znajdziesz tutaj: 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 RecyclerView.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ż dostarczać unikalny identyfikator wyboru do konstruktora 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.
- Codelab Android Kotlin Fundamentals: RecyclerView fundamentals.