Dostosowywanie listy dynamicznej, części Androida Jetpack.
Możesz dostosować obiekty RecyclerView do swoich potrzeb. Standardowe klasy opisane w artykule Tworzenie list dynamicznych za pomocą RecyclerView zapewniają wszystkie funkcje, których potrzebuje większość deweloperów. W wielu przypadkach wystarczy zaprojektować widok dla każdego obiektu ViewHolder i napisać kod, który będzie aktualizował te widoki za pomocą odpowiednich danych. Jeśli jednak Twoja aplikacja ma określone wymagania, możesz na wiele 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 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 ze zbioru danych. Recykling widoków w ten sposób poprawia wydajność, ponieważ pozwala uniknąć tworzenia niepotrzebnych widoków i wykonywania kosztownych operacji wyszukiwania findViewById(). Biblioteka pomocy Androida zawiera 3 standardowe menedżery układu, z których każdy oferuje wiele opcji dostosowywania:
LinearLayoutManager: rozmieszcza elementy na jednowymiarowej liście. UżycieRecyclerViewzLinearLayoutManagerzapewnia funkcje takie jak układListView.GridLayoutManager: rozmieszcza elementy w dwuwymiarowej siatce, podobnie jak kwadraty na szachownicy. UżycieRecyclerViewzGridLayoutManagerzapewnia funkcje takie jak układGridView.StaggeredGridLayoutManager: rozmieszcza elementy w dwuwymiarowej siatce, przy czym każda kolumna jest nieco przesunięta względem poprzedniej, podobnie jak gwiazdy na amerykańskiej fladze.
Jeśli te menedżery układu nie odpowiadają Twoim potrzebom, możesz utworzyć własny, rozszerzając klasę abstrakcyjną RecyclerView.LayoutManager.
Dodawanie animacji elementów
Za każdym razem, 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ępniać niestandardowe animacje, możesz zdefiniować własny obiekt animatora, rozszerzając RecyclerView.ItemAnimator.
Włącz wybór elementu 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 zachowujesz kontrolę nad wizualną prezentacją wybranego elementu. Możesz też zachować kontrolę nad zasadami dotyczącymi zachowania podczas wyboru, np. 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 chcesz użyć, a następnie utwórz obiekt
ItemKeyProvider.Wybrane elementy możesz identyfikować za pomocą 3 typów kluczy:
Parcelablei jej podklasy, takie jakUriStringLong
Szczegółowe informacje o typach kluczy wyboru znajdziesz w artykule
SelectionTracker.Builder. - Zaimplementuj
ItemDetailsLookup. - Zaktualizuj obiekty
Viewelementu wRecyclerView, aby odzwierciedlić, czy użytkownik je zaznacza, czy odznacza.Biblioteka wyboru nie udostępnia domyślnej dekoracji wizualnej wybranych elementów. Podaj tę wartość podczas wdrażania
onBindViewHolder(). Zalecamy następujące podejście:- W
onBindViewHolder()wywołajsetActivated()– niesetSelected()– w obiekcieViewztruelubfalse, w zależności od tego, czy element jest zaznaczony. - 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. - wykonać wszelkie 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 fabryka instancji ItemDetails, które są tworzone na podstawie instancji RecyclerView.ViewHolder lub z niej wyodrębniane.
Zarejestruj SelectionTracker.SelectionObserver, aby otrzymywać powiadomienia o zmianie wyboru. Po utworzeniu zaznaczenia uruchom ActionMode, aby wyświetlić je użytkownikowi i udostępnić działania związane z zaznaczeniem. Możesz na przykład dodać przycisk usuwania do paska ActionMode i połączyć strzałkę wstecz na pasku, aby wyczyścić zaznaczenie. Gdy zaznaczenie stanie się puste – jeśli użytkownik wyczyści zaznaczenie po raz ostatni – zakończ tryb działania.
Na końcu potoku przetwarzania zdarzeń biblioteka może określić, czy użytkownik próbuje aktywować element, klikając go, czy też próbuje przeciągnąć element lub zestaw wybranych elementów. Możesz reagować na te interpretacje, rejestrując odpowiedni detektor. Więcej informacji znajdziesz w artykule SelectionTracker.Builder.
Poniższy 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 dostarczyć do SelectionTracker.Builder ten sam obiekt RecyclerView.Adapter, który jest używany do inicjowania RecyclerView. Dlatego po utworzeniu instancji SelectionTracker wstrzyknij ją do RecyclerView.Adapter. W przeciwnym razie nie możesz sprawdzić stanu zaznaczenia elementu za pomocą metody onBindViewHolder().
Aby zachować stan wyboru w zdarzeniach cyklu życia działania, aplikacja musi wywoływać metody onSaveInstanceState() i onRestoreInstanceState() modułu śledzącego wybór odpowiednio z metod onSaveInstanceState() i onRestoreInstanceState() działania. Aplikacja musi też podać unikalny identyfikator wyboru konstruktorowi SelectionTracker.Builder. Ten identyfikator jest wymagany, ponieważ aktywność lub fragment może mieć więcej niż 1 odrębną listę do wyboru, a wszystkie muszą być zachowane w zapisanych stanach.
Dodatkowe materiały
Więcej informacji znajdziesz w tych materiałach.
- aplikacja demonstracyjna Sunflower, która korzysta z
RecyclerView. - Używanie RecyclerView do wyświetlania przewijanej listy (ćwiczenie w Codelabs).
- Podstawy Androida w języku Kotlin: podstawy RecyclerView (ćwiczenie w Codelabs).