Dostosowywanie listy dynamicznej Część Androida Jetpack.
Możesz dostosować obiekty RecyclerView do swoich potrzeb. Standardowe klasy opisane w
Tworzenie list dynamicznych za pomocą
RecyclerView zapewniają wszystkie funkcje, których potrzebuje większość programistów. W wielu przypadkach wystarczy zaprojektować widok dla każdego elementu `ViewHolder` i napisać kod, który będzie aktualizować te widoki odpowiednimi danymi. Jeśli jednak Twoja aplikacja ma określone 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 pozycjonowania poszczególnych elementów na ekranie i określania, kiedy należy ponownie użyć widoków elementów, które nie są już widoczne dla użytkownika. Aby ponownie użyć – lub odtworzyć – widok, menedżer układu
może poprosić adapter o zastąpienie zawartości widoku innym
elementem z zbioru danych. Ponowne używanie widoków w ten sposób poprawia 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żywanieRecyclerViewzLinearLayoutManagerzapewnia funkcje podobne do układuListView.GridLayoutManager: rozmieszcza elementy w siatce dwuwymiarowej, podobnie jak kwadraty na szachownicy. UżywanieRecyclerViewzGridLayoutManagerzapewnia funkcje podobne doGridViewukładu.StaggeredGridLayoutManager: rozmieszcza elementy w siatce dwuwymiarowej, 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 do zmiany jego wyglądu. Ten animator to obiekt, który rozszerza klasę abstrakcyjną RecyclerView.ItemAnimator. Domyślnie RecyclerView używa DefaultItemAnimator do animacji. Jeśli chcesz używać niestandardowych animacji, możesz zdefiniować własny obiekt animatora, rozszerzając RecyclerView.ItemAnimator.
Włączanie wybierania elementów listy
Biblioteka
recyclerview-selection
umożliwia użytkownikom wybieranie elementów na liście RecyclerView za pomocą dotyku
lub sygnału myszy. Dzięki temu możesz zachować kontrolę nad wizualną prezentacją wybranego elementu. Możesz też zachować kontrolę nad zasadami dotyczącymi zachowania podczas wybierania, np. które elementy można wybrać i ile elementów można wybrać.
Aby dodać obsługę wybierania 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żyć 3 typów kluczy:
Parcelablei jego podklasy, np.UriStringLong
Szczegółowe informacje o typach kluczy wyboru znajdziesz w artykule
SelectionTracker.Builder. - Zaimplementuj
ItemDetailsLookup. - Zaktualizuj obiekty elementów
ViewwRecyclerView, aby odzwierciedlały, czy użytkownik je wybiera czy odznacza.Biblioteka wyboru nie zapewnia domyślnej dekoracji wizualnej dla wybranych elementów. Dodaj ją podczas implementowania
onBindViewHolder(). Zalecamy to podejście:- W
onBindViewHolder()wywołajsetActivated()–niesetSelected()– na obiekcieViewz wartościątruelubfalse, 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
ActionModeaby udostępnić użytkownikowi narzędzia do wykonywania działań na zaznaczeniu. - Wykonaj wszystkie zinterpretowane działania dodatkowe.
- Połącz 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 wyodrębniane.
Zarejestruj
SelectionTracker.SelectionObserver
, aby otrzymywać powiadomienia o zmianach zaznaczenia. Gdy po raz pierwszy utworzysz zaznaczenie,
uruchom ActionMode aby je wyświetlić i udostępnić użytkownikowi działania związane z zaznaczeniem. Możesz na przykład dodać przycisk usuwania do
ActionMode paska i połączyć strzałkę wstecz na pasku z wyczyszczeniem
zaznaczenia. Gdy zaznaczenie stanie się puste – jeśli użytkownik ostatnio wyczyścił zaznaczenie
– 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 albo zestaw wybranych elementów. Aby reagować na te
interpretacje, zarejestruj odpowiedni odbiornik. Więcej informacji znajdziesz w artykule 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 przekazać do
SelectionTracker.Builder ten sam
RecyclerView.Adapter
, którego używasz do inicjowania RecyclerView. Z tego powodu po utworzeniu instancji
SelectionTracker wstrzyknij ją do
RecyclerView.Adapter. W przeciwnym razie nie możesz sprawdzić stanu wybranego elementu za pomocą metody onBindViewHolder().
Aby zachować stan zaznaczenia w zdarzeniach cyklu życia działania, aplikacja
musi wywoływać metody narzędzia do śledzenia zaznaczenia
onSaveInstanceState()
i
onRestoreInstanceState()
odpowiednio z metod działania
onSaveInstanceState()
i
onRestoreInstanceState(). Aplikacja musi też przekazać unikalny identyfikator zaznaczenia do
SelectionTracker.Builder konstruktora. Ten identyfikator jest wymagany, ponieważ
aktywność lub fragment może mieć więcej niż 1 odrębną listę, którą można wybrać,
i wszystkie te listy muszą być zachowane w zapisanym stanie.
Dodatkowe materiały
Więcej informacji znajdziesz w tych materiałach:
- Aplikacja w wersji demonstracyjnej Sunflower, która używa
RecyclerView. - Ćwiczenie w Codelabs: wyświetlanie przewijanej listy za pomocą RecyclerView.
- Ćwiczenie w Codelabs: podstawy RecyclerView w Kotlinie na Androidzie.