Zadbaj o dobrą organizację dzięki kolekcji
Zapisuj i kategoryzuj treści zgodnie ze swoimi preferencjami.
Dostosowywanie listy dynamicznej
Część Androida Jetpack.
Wypróbuj Compose
Jetpack Compose to zalecany zestaw narzędzi interfejsu na Androida. Dowiedz się, jak pracować z układami w Compose.
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 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 z zestawu danych. Recykling 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 funkcjonalność podobną do układu ListView
.
GridLayoutManager
: rozmieszcza elementy w dwuwymiarowej siatce, podobnie jak pola na szachownicy. Użycie RecyclerView
z GridLayoutManager
zapewnia funkcjonalność podobną do układu GridView
.
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ć animacje niestandardowe, 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 produkty kwalifikują się do wyboru i ile produktó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:
Szczegółowe informacje o typach kluczy wyboru znajdziesz w artykule SelectionTracker.Builder
.
- Wdróż
ItemDetailsLookup
.
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.
- Zaktualizuj obiekty
View
w RecyclerView
, 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łaj
setActivated()
—nie
setSelected()
—włącz
obiekt View
z 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.
- Użyj
ActionMode
, aby udostępnić użytkownikowi narzędzia do wykonania działania na zaznaczeniu.
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 opcją czyszczenia wyboru. Gdy wybór będzie pusty (jeśli użytkownik ostatnim razem wyczyści wybór), zakończ tryb działania.
- wykonywać zinterpretowane działania dodatkowe,
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
.
- Złóż wszystko za pomocą
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()
.
- Uwzględnij wybór w zdarzeniach cyklu życia aktywności.
Aby zachować stan wyboru w zdarzeniach cyklu życia działania, aplikacja musi wywoływać metody onSaveInstanceState()
i onRestoreInstanceState()
trackera wyboru z metod onSaveInstanceState()
i onRestoreInstanceState()
działania. Aplikacja musi też przekazywać 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ę, a wszystkie te listy muszą być zachowywane w zapisanym stanie.
Dodatkowe materiały
Więcej informacji znajdziesz w tych materiałach.
Treść strony i umieszczone na niej fragmenty kodu podlegają licencjom opisanym w Licencji na treści. Java i OpenJDK są znakami towarowymi lub zastrzeżonymi znakami towarowymi należącymi do firmy Oracle lub jej podmiotów stowarzyszonych.
Ostatnia aktualizacja: 2025-08-27 UTC.
[[["Łatwo zrozumieć","easyToUnderstand","thumb-up"],["Rozwiązało to mój problem","solvedMyProblem","thumb-up"],["Inne","otherUp","thumb-up"]],[["Brak potrzebnych mi informacji","missingTheInformationINeed","thumb-down"],["Zbyt skomplikowane / zbyt wiele czynności do wykonania","tooComplicatedTooManySteps","thumb-down"],["Nieaktualne treści","outOfDate","thumb-down"],["Problem z tłumaczeniem","translationIssue","thumb-down"],["Problem z przykładami/kodem","samplesCodeIssue","thumb-down"],["Inne","otherDown","thumb-down"]],["Ostatnia aktualizacja: 2025-08-27 UTC."],[],[],null,["# Customize a dynamic list\nPart of [Android Jetpack](/jetpack).\n=============================================================\n\nTry the Compose way \nJetpack Compose is the recommended UI toolkit for Android. Learn how to work with layouts in Compose. \n[Lazy Lists and Grids →](/jetpack/compose/lists#lazy) \n\nYou can customize\n[RecyclerView](/reference/androidx/recyclerview/widget/RecyclerView)\nobjects to meet your specific needs. The standard classes described in\n[Create dynamic lists with\nRecyclerView](/guide/topics/ui/layout/recyclerview) provide all the functionality that most developers need. In\nmany cases, you only need to design the view for each view holder and write the\ncode to update those views with the appropriate data. However, if your app has\nspecific requirements, you can modify the standard behavior in a number of ways.\nThis document describes some of the possible customizations.\n\nModify the layout\n-----------------\n\n`RecyclerView` uses a layout manager to position the individual\nitems on the screen and to determine when to reuse item views that are no longer\nvisible to the user. To reuse---or *recycle* ---a view, a layout\nmanager might ask the adapter to replace the contents of the view with a\ndifferent element from the dataset. Recycling views this way improves\nperformance by avoiding the creation of unnecessary views or performing\nexpensive\n[findViewById()](/reference/android/app/Activity#findViewById(int))\nlookups. The Android Support Library includes three standard layout managers,\nach of which offers many customization options:\n\n- [LinearLayoutManager](/reference/androidx/recyclerview/widget/LinearLayoutManager): arranges the items in a one-dimensional list. Using a `RecyclerView` with `LinearLayoutManager` provides functionality like a [ListView](/reference/android/widget/ListView) layout.\n- [GridLayoutManager](/reference/androidx/recyclerview/widget/GridLayoutManager): arranges the items in a two-dimensional grid, like the squares on a checkerboard. Using a `RecyclerView` with `GridLayoutManager` provides functionality like a [GridView](/reference/android/widget/GridView) layout.\n- [StaggeredGridLayoutManager](/reference/androidx/recyclerview/widget/StaggeredGridLayoutManager): arranges the items in a two-dimensional grid, with each column slightly offset from the one before, like the stars on an American flag.\n\nIf these layout managers don't suit your needs, you can create your own by\nextending the\n[RecyclerView.LayoutManager](/reference/androidx/recyclerview/widget/RecyclerView.LayoutManager)\nabstract class.\n\nAdd item animations\n-------------------\n\nWhenever an item changes, `RecyclerView` uses an *animator*\nto change its appearance. This animator is an object that extends the abstract\n[RecyclerView.ItemAnimator](/reference/androidx/recyclerview/widget/RecyclerView.ItemAnimator)\nclass. By default, the `RecyclerView` uses\n[DefaultItemAnimator](/reference/androidx/recyclerview/widget/DefaultItemAnimator)\nto provide the animation. If you want to provide custom animations, you can\ndefine your own animator object by extending\n`RecyclerView.ItemAnimator`.\n\nEnable list-item selection\n--------------------------\n\nThe\n[`recyclerview-selection`](/reference/androidx/recyclerview/selection/package-summary)\nlibrary lets users select items in a `RecyclerView` list using touch\nor mouse input. This lets you retain control over the visual presentation of a\nselected item. You can also retain control over policies controlling selection\nbehavior, such as which items are eligible for selection and how many items can\nbe selected.\n\nTo add selection support to a `RecyclerView` instance, follow\nthese steps:\n\n1. Determine which selection key type to use, then build an [`ItemKeyProvider`](/reference/androidx/recyclerview/selection/ItemKeyProvider).\n\n There are three key types you can use to identify selected items:\n - [Parcelable](/reference/android/os/Parcelable) and its subclasses, like [Uri](/reference/android/net/Uri)\n - [String](/reference/java/lang/String)\n - [Long](/reference/java/lang/Long)\n\n For detailed information about selection-key types, see\n [SelectionTracker.Builder](/reference/androidx/recyclerview/selection/SelectionTracker.Builder).\n2. Implement [ItemDetailsLookup](/reference/androidx/recyclerview/selection/ItemDetailsLookup).\n3. `ItemDetailsLookup` lets the selection library access information about `RecyclerView` items given a [MotionEvent](/reference/android/view/MotionEvent). It is effectively a factory for [`ItemDetails`](/reference/androidx/recyclerview/selection/ItemDetailsLookup.ItemDetails) instances that are backed up by, or extracted from, a [RecyclerView.ViewHolder](/reference/androidx/recyclerview/widget/RecyclerView.ViewHolder) instance.\n4. Update item [View](/reference/android/view/View) objects in the `RecyclerView` to reflect whether the user selects or unselects them.\n\n The selection library doesn't provide a default visual decoration for the\n selected items. Provide this when you implement\n [onBindViewHolder()](/reference/androidx/recyclerview/widget/RecyclerView.Adapter#onBindViewHolder(VH, int)).\n We recommend the following approach:\n - In `onBindViewHolder()`, call [setActivated()](/reference/android/view/View#setActivated(boolean))---**not** [setSelected()](/reference/android/view/View#setSelected(boolean))---on the `View` object with `true` or `false`, depending on whether the item is selected.\n - Update the styling of the view to represent the activated status. We recommend using a [color state\n list resource](/guide/topics/resources/color-list-resource) to configure the styling.\n5. Use [ActionMode](/reference/androidx/appcompat/view/ActionMode) to provide the user with tools to perform an action on the selection.\n6. Register a [SelectionTracker.SelectionObserver](/reference/androidx/recyclerview/selection/SelectionTracker.SelectionObserver) to be notified when a selection changes. When a selection is first created, start `ActionMode` to present this to the user and provide selection-specific actions. For example, you can add a delete button to the `ActionMode` bar and connect the back arrow on the bar to clear the selection. When the selection becomes empty---if the user clears the selection the last time---terminate action mode.\n7. Perform any interpreted secondary actions.\n8. At the end of the event processing pipeline, the library might determine that the user is attempting to activate an item, by tapping it, or is attempting to drag an item or set of selected items. React to these interpretations by registering the appropriate listener. For more information, see [SelectionTracker.Builder](/reference/androidx/recyclerview/selection/SelectionTracker.Builder).\n9. Assemble everything with `SelectionTracker.Builder`.\n10. The following example shows how to put these pieces together: \n\n### Kotlin\n\n```kotlin\n var tracker = SelectionTracker.Builder(\n \"my-selection-id\",\n recyclerView,\n StableIdKeyProvider(recyclerView),\n MyDetailsLookup(recyclerView),\n StorageStrategy.createLongStorage())\n .withOnItemActivatedListener(myItemActivatedListener)\n .build()\n \n```\n\n### Java\n\n```java\n SelectionTracker tracker = new SelectionTracker.Builder\u003c\u003e(\n \"my-selection-id\",\n recyclerView,\n new StableIdKeyProvider(recyclerView),\n new MyDetailsLookup(recyclerView),\n StorageStrategy.createLongStorage())\n .withOnItemActivatedListener(myItemActivatedListener)\n .build();\n \n```\n11. To build a [SelectionTracker](/reference/androidx/recyclerview/selection/SelectionTracker) instance, your app must supply the same [RecyclerView.Adapter](/reference/androidx/recyclerview/widget/RecyclerView.Adapter) that you use to initialize `RecyclerView` to `SelectionTracker.Builder`. For this reason, after you create the `SelectionTracker` instance, inject it into your `RecyclerView.Adapter`. Otherwise, you can't check an item's selected status from the `onBindViewHolder()` method.\n12. Include selection in the [activity\n lifecycle](/guide/components/activities/activity-lifecycle) events.\n13. To preserve selection state across the activity lifecycle events, your app must call the selection tracker's [onSaveInstanceState()](/reference/androidx/recyclerview/selection/SelectionTracker#onSaveInstanceState(android.os.Bundle)) and [onRestoreInstanceState()](/reference/androidx/recyclerview/selection/SelectionTracker#onRestoreInstanceState(android.os.Bundle)) methods from the activity's [onSaveInstanceState()](/reference/android/app/Activity#onSaveInstanceState(android.os.Bundle)) and [onRestoreInstanceState()](/reference/android/app/Activity#onRestoreInstanceState(android.os.Bundle)) methods, respectively. Your app must also supply a unique selection ID to the `SelectionTracker.Builder` constructor. This ID is required because an activity or a fragment might have more than one distinct, selectable list, all of which need to be persisted in their saved state.\n\nAdditional resources\n--------------------\n\nSee the following references for additional information.\n\n- [Sunflower\n demo app](https://github.com/googlesamples/android-sunflower), which uses `RecyclerView`.\n- [Use\n RecyclerView to display a scrollable list](/codelabs/basic-android-kotlin-training-recyclerview-scrollable-list#0) codelab.\n- [Android\n Kotlin Fundamentals: RecyclerView fundamentals](/codelabs/kotlin-android-training-recyclerview-fundamentals) codelab."]]