Mantieni tutto organizzato con le raccolte
Salva e classifica i contenuti in base alle tue preferenze.
Personalizzare un elenco dinamico
Parte di Android Jetpack.
Prova Compose
Jetpack Compose è il toolkit per la UI consigliato per Android. Scopri come utilizzare i layout in Crea.
Puoi personalizzare
RecyclerView
gli oggetti per soddisfare le tue esigenze specifiche. Le classi standard descritte in
Creare elenchi dinamici con
RecyclerView forniscono tutte le funzionalità di cui la maggior parte degli sviluppatori ha bisogno. In
molti casi, devi solo progettare la visualizzazione per ogni segnaposto della visualizzazione e scrivere il
codice per aggiornare queste visualizzazioni con i dati appropriati. Tuttavia, se la tua app ha
requisiti specifici, puoi modificare il comportamento standard in diversi modi.
Questo documento descrive alcune delle personalizzazioni possibili.
Modificare il layout
RecyclerView
utilizza un gestore del layout per posizionare i singoli
elementi sullo schermo e per determinare quando riutilizzare le visualizzazioni degli elementi che non sono più
visibili all'utente. Per riutilizzare o riciclare una vista, un gestore del layout potrebbe chiedere all'adattatore di sostituire i contenuti della vista con un elemento diverso del set di dati. Il riutilizzo delle viste in questo modo migliora
le prestazioni evitando la creazione di viste non necessarie o l'esecuzione di
costose
findViewById()
ricerche. La libreria di supporto Android include tre gestori di layout standard,
ognuno dei quali offre molte opzioni di personalizzazione:
LinearLayoutManager
:
dispone gli elementi in un elenco unidimensionale. L'utilizzo di un
RecyclerView
con LinearLayoutManager
fornisce
funzionalità come un
layout
ListView
.
GridLayoutManager
:
dispone gli elementi in una griglia bidimensionale, come i quadrati di una
scacchiera. L'utilizzo di un RecyclerView
con
GridLayoutManager
fornisce funzionalità simili a un
layout GridView
.
StaggeredGridLayoutManager
:
dispone gli elementi in una griglia bidimensionale, con ogni colonna leggermente sfalsata
rispetto a quella precedente, come le stelle sulla bandiera americana.
Se questi gestori di layout non soddisfano le tue esigenze, puoi crearne uno personalizzato
estendendo la
classe astratta RecyclerView.LayoutManager
.
Aggiungere animazioni agli elementi
Ogni volta che un elemento cambia, RecyclerView
utilizza un animatore
per modificarne l'aspetto. Questo animatore è un oggetto che estende la classe astratta
RecyclerView.ItemAnimator
. Per impostazione predefinita, RecyclerView
utilizza
DefaultItemAnimator
per fornire l'animazione. Se vuoi fornire animazioni personalizzate, puoi
definire il tuo oggetto animatore estendendo
RecyclerView.ItemAnimator
.
Attiva la selezione degli elementi dell'elenco
La
libreria
recyclerview-selection
consente agli utenti di selezionare elementi in un elenco RecyclerView
utilizzando l'input tocco
o mouse. In questo modo, puoi mantenere il controllo sulla presentazione visiva di un
elemento selezionato. Puoi anche mantenere il controllo sulle norme che regolano il comportamento di selezione, ad esempio quali elementi sono idonei per la selezione e quanti elementi possono essere selezionati.
Per aggiungere il supporto della selezione a un'istanza di RecyclerView
, segui
questi passaggi:
- Determina il tipo di chiave di selezione da utilizzare, quindi crea un
ItemKeyProvider
.
Esistono tre tipi principali che puoi utilizzare per identificare gli elementi selezionati:
Per informazioni dettagliate sui tipi di chiavi di selezione, consulta
SelectionTracker.Builder
.
- Implementa
ItemDetailsLookup
.
ItemDetailsLookup
consente alla libreria di selezione di accedere
alle informazioni sugli elementi RecyclerView
dato un
MotionEvent
.
È a tutti gli effetti una fabbrica di istanze ItemDetails
di cui è stato eseguito il backup o estratte da un'istanza RecyclerView.ViewHolder
.
- Aggiorna gli oggetti
View
nell'RecyclerView
per riflettere se l'utente li seleziona o
li deseleziona.
La libreria di selezione non fornisce una decorazione visiva predefinita per gli elementi selezionati. Fornisci questo valore quando implementi
onBindViewHolder()
.
Ti consigliamo di procedere come segue:
- In
onBindViewHolder()
, chiama
setActivated()
—non
setSelected()
—su
l'oggetto View
con
true
o false
, a seconda che l'elemento
sia selezionato.
- Aggiorna lo stile della visualizzazione in modo che rappresenti lo stato attivato. Ti
consigliamo di utilizzare
una risorsa
elenco stati colore per configurare lo stile.
- Utilizza
ActionMode
per fornire all'utente gli strumenti per eseguire un'azione sulla selezione.
Registra un
SelectionTracker.SelectionObserver
per ricevere una notifica quando una selezione cambia. Quando viene creata una selezione,
avvia ActionMode
per presentarla all'utente e fornire
azioni specifiche per la selezione. Ad esempio, puoi aggiungere un pulsante di eliminazione alla
barra ActionMode
e collegare la freccia indietro sulla barra per cancellare
la selezione. Quando la selezione diventa vuota, se l'utente cancella la
selezione l'ultima volta, termina la modalità di azione.
- Esegui eventuali azioni secondarie interpretate.
Alla fine della pipeline di elaborazione degli eventi, la libreria potrebbe determinare
che l'utente sta tentando di attivare un elemento toccandolo o
sta tentando di trascinare un elemento o un insieme di elementi selezionati. Reagisci a queste
interpretazioni registrando il listener appropriato. Per ulteriori
informazioni, vedi
SelectionTracker.Builder
.
- Assembla tutto con
SelectionTracker.Builder
.
Il seguente esempio mostra come mettere insieme questi elementi:
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();
Per creare un'istanza di
SelectionTracker
, la tua app deve fornire lo stesso
RecyclerView.Adapter
che utilizzi per inizializzare RecyclerView
in
SelectionTracker.Builder
. Per questo motivo, dopo aver creato l'istanza SelectionTracker
, inseriscila in RecyclerView.Adapter
. In caso contrario, non puoi controllare lo stato selezionato di un elemento dal metodo onBindViewHolder()
.
- Includi la selezione negli eventi del
ciclo di vita
dell'attività.
Per conservare lo stato di selezione durante gli eventi del ciclo di vita dell'attività, la tua app
deve chiamare i metodi
onSaveInstanceState()
e
onRestoreInstanceState()
del tracker di selezione
dai metodi
onSaveInstanceState()
e
onRestoreInstanceState()
dell'attività, rispettivamente. La tua app deve fornire anche un ID selezione univoco al costruttore SelectionTracker.Builder
. Questo ID è necessario perché
un'attività o un frammento potrebbe avere più di un elenco distinto e selezionabile,
tutti devono essere mantenuti nel loro stato salvato.
Risorse aggiuntive
Per ulteriori informazioni, consulta i seguenti riferimenti.
I campioni di contenuti e codice in questa pagina sono soggetti alle licenze descritte nella Licenza per i contenuti. Java e OpenJDK sono marchi o marchi registrati di Oracle e/o delle sue società consociate.
Ultimo aggiornamento 2025-08-27 UTC.
[[["Facile da capire","easyToUnderstand","thumb-up"],["Il problema è stato risolto","solvedMyProblem","thumb-up"],["Altra","otherUp","thumb-up"]],[["Mancano le informazioni di cui ho bisogno","missingTheInformationINeed","thumb-down"],["Troppo complicato/troppi passaggi","tooComplicatedTooManySteps","thumb-down"],["Obsoleti","outOfDate","thumb-down"],["Problema di traduzione","translationIssue","thumb-down"],["Problema relativo a esempi/codice","samplesCodeIssue","thumb-down"],["Altra","otherDown","thumb-down"]],["Ultimo aggiornamento 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."]]