Dostosowywanie listy dynamicznej   Część Androida Jetpack.

Wypróbuj Compose
Jetpack Compose to zalecany zestaw narzędzi do tworzenia interfejsu użytkownika na Androidzie. Dowiedz się, jak pracować z układami w Compose.

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żywanie RecyclerView z LinearLayoutManager zapewnia funkcje podobne do układu ListView.
  • GridLayoutManager: rozmieszcza elementy w siatce dwuwymiarowej, podobnie jak kwadraty na szachownicy. Używanie RecyclerView z GridLayoutManager zapewnia funkcje podobne do GridView ukł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:

  1. 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:

    Szczegółowe informacje o typach kluczy wyboru znajdziesz w artykule SelectionTracker.Builder.

  2. Zaimplementuj ItemDetailsLookup.
  3. 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.

  4. Zaktualizuj obiekty elementów View w RecyclerView, 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łaj setActivated()nie setSelected() – na obiekcie View z wartością true lub false, 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.
  5. Użyj ActionMode aby udostępnić użytkownikowi narzędzia do wykonywania działań na zaznaczeniu.
  6. 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.

  7. Wykonaj wszystkie zinterpretowane działania dodatkowe.
  8. 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.

  9. Połącz wszystko za pomocą SelectionTracker.Builder.
  10. 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().

  11. Uwzględnij wybór w zdarzeniach cyklu życia aktywności.
  12. 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: