Dostosowywanie listy dynamicznej Część Androida Jetpack.
Możesz dostosowaćRecyclerView
obiekty do swoich potrzeb. Standardowe klasy opisane w artykule Tworzenie list dynamicznych za pomocą elementu RecyclerView zapewniają wszystkie funkcje, których potrzebuje większość programistów. W wielu przypadkach wystarczy zaprojektować widok dla każdego obiektu widoku i napisać kod, który będzie aktualizować te widoki odpowiednimi danymi. Jeśli jednak Twoja aplikacja ma konkretne wymagania, możesz na kilka sposobów zmodyfikować standardowe działanie.
W tym dokumencie opisujemy niektóre z możliwych dostosowań.
Modyfikowanie układu
RecyclerView
używa menedżera układu do rozmieszczania poszczególnych elementów na ekranie i określania, kiedy ponownie użyć widoków elementów, które nie są już widoczne dla użytkownika. Aby ponownie użyć widoku, menedżer układu może poprosić adapter o zastąpienie zawartości widoku innym elementem z zestawu danych. Ponowne wykorzystywanie widoków w ten sposób zwiększa wydajność, ponieważ pozwala uniknąć tworzenia niepotrzebnych widoków lub wykonywania kosztownych wyszukiwań.findViewById()
Biblioteka pomocy Androida zawiera 3 standardowe menedżery układu, z których każdy oferuje wiele opcji dostosowywania:
LinearLayoutManager
: rozmieszcza elementy na liście jednowymiarowej. UżywanieRecyclerView
zLinearLayoutManager
zapewnia funkcjonalność podobną do układuListView
.GridLayoutManager
: rozmieszcza elementy w dwuwymiarowej siatce, podobnie jak pola na szachownicy. UżycieRecyclerView
zGridLayoutManager
zapewnia funkcjonalność podobną do układuGridView
.StaggeredGridLayoutManager
: rozmieszcza elementy w dwuwymiarowej siatce, w której każda kolumna jest lekko przesunięta względem poprzedniej, podobnie jak gwiazdy na fladze Stanów Zjednoczonych.
Jeśli te menedżery układu nie spełniają Twoich potrzeb, możesz utworzyć własny, rozszerzając klasę abstrakcyjną RecyclerView.LayoutManager
.
Dodawanie animacji elementów
Gdy element się zmienia, RecyclerView
używa animatora, aby zmienić jego wygląd. Animator to obiekt, który rozszerza klasę abstrakcyjną RecyclerView.ItemAnimator
. Domyślnie RecyclerView
używa
DefaultItemAnimator
do wyświetlania animacji. Jeśli chcesz udostępnić niestandardowe animacje, możesz zdefiniować własny obiekt animatora, rozszerzając klasę RecyclerView.ItemAnimator
.
Włączanie wyboru elementów listy
Biblioteka
recyclerview-selection
umożliwia użytkownikom wybieranie elementów na liście RecyclerView
za pomocą dotyku lub myszy. Dzięki temu zachowasz kontrolę nad wizualną prezentacją wybranego produktu. Możesz też zachować kontrolę nad zasadami określającymi zachowanie związane z wyborem, np. które elementy kwalifikują się do wyboru i ile elementów można wybrać.
Aby dodać obsługę wyboru do instancji RecyclerView
, wykonaj te czynności:
- Określ, jakiego typu klucza wyboru chcesz użyć, a następnie utwórz
ItemKeyProvider
.Do identyfikowania wybranych elementów możesz używać 3 głównych typów:
Parcelable
i jego podklasy, np.Uri
String
Long
Szczegółowe informacje o typach kluczy wyboru znajdziesz w artykule
SelectionTracker.Builder
. - Wdróż
ItemDetailsLookup
. - Zaktualizuj obiekty
View
wRecyclerView
, aby odzwierciedlić, czy użytkownik wybiera lub odznacza elementy.Biblioteka wyboru nie zapewnia domyślnej dekoracji wizualnej dla wybranych elementów. Podaj tę wartość podczas wdrażania
onBindViewHolder()
. Zalecamy następujące podejście:- W
onBindViewHolder()
wywołajsetActivated()
–niesetSelected()
–włącz obiektView
ztrue
lubfalse
w zależności od tego, czy element jest wybrany. - Zaktualizuj styl widoku, aby odzwierciedlał stan aktywacji. Do skonfigurowania stylu zalecamy użycie zasobu listy stanów kolorów.
- W
- Użyj
ActionMode
, aby udostępnić użytkownikowi narzędzia do wykonania działania na zaznaczeniu. - wykonywać wszystkie zinterpretowane działania dodatkowe,
- Złóż wszystko za pomocą
SelectionTracker.Builder
. - Uwzględnij wybór w zdarzeniach cyklu życia aktywności.
ItemDetailsLookup
umożliwia bibliotece wyboru dostęp do informacji o elementach RecyclerView
na podstawie MotionEvent
.
Jest to w zasadzie fabryka instancji ItemDetails
, które są tworzone na podstawie instancji RecyclerView.ViewHolder
lub z niej pobierane.
Zarejestruj SelectionTracker.SelectionObserver
, aby otrzymywać powiadomienia o zmianach wyboru. Gdy wybór zostanie utworzony po raz pierwszy, uruchom ActionMode
, aby wyświetlić go użytkownikowi i udostępnić działania związane z wyborem. Możesz na przykład dodać przycisk usuwania do paska ActionMode
i połączyć strzałkę wstecz na pasku z wyczyszczeniem wyboru. Gdy wybór będzie pusty (jeśli użytkownik ostatnim razem wyczyści wybór), 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 odpowiedni detektor. Więcej informacji znajdziesz w sekcji SelectionTracker.Builder
.
W tym przykładzie pokazujemy, 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 dostarczyć ten sam obiekt RecyclerView.Adapter
, którego używasz do inicjowania obiektu RecyclerView
w obiekcie SelectionTracker.Builder
. Dlatego po utworzeniu instancji SelectionTracker
wstrzyknij ją do instancji RecyclerView.Adapter
. W przeciwnym razie nie możesz sprawdzić wybranego stanu produktu za pomocą metody onBindViewHolder()
.
Aby zachować stan wyboru podczas zdarzeń cyklu życia aktywności, aplikacja musi wywoływać metody onSaveInstanceState()
i onRestoreInstanceState()
modułu śledzenia wyboru odpowiednio z metod onSaveInstanceState()
i onRestoreInstanceState()
aktywności. Aplikacja musi też przekazać unikalny identyfikator wyboru do konstruktora SelectionTracker.Builder
. Ten identyfikator jest wymagany, ponieważ aktywność lub fragment może mieć więcej niż 1 odrębną, wybieraną listę, z których wszystkie muszą być zachowane w zapisanym stanie.
Dodatkowe materiały
Więcej informacji znajdziesz w tych materiałach.
- aplikacja demonstracyjna Sunflower, która korzysta z
RecyclerView
. - Ćwiczenie w Codelabs Używanie elementu RecyclerView do wyświetlania listy z możliwością przewijania.
- Android Kotlin Fundamentals: RecyclerView fundamentals (warsztaty).