Restez organisé à l'aide des collections
Enregistrez et classez les contenus selon vos préférences.
Personnaliser une liste dynamique
Fait partie d'Android Jetpack.
Essayer Compose
Jetpack Compose est le kit d'outils d'UI recommandé pour Android. Découvrez comment utiliser les mises en page dans Compose.
Vous pouvez personnaliser les objets RecyclerView
pour répondre à vos besoins spécifiques. Les classes standards décrites dans Créer des listes dynamiques avec RecyclerView fournissent toutes les fonctionnalités dont la plupart des développeurs ont besoin. Dans de nombreux cas, il vous suffit de concevoir la vue pour chaque conteneur de vues et d'écrire le code permettant de mettre à jour ces vues avec les données appropriées. Toutefois, si votre application présente des exigences spécifiques, vous pouvez modifier le comportement standard de plusieurs façons.
Ce document décrit certaines des personnalisations possibles.
Modifier la mise en page
RecyclerView
utilise un gestionnaire de mise en page pour positionner les éléments individuels à l'écran et déterminer quand réutiliser les vues d'éléments qui ne sont plus visibles par l'utilisateur. Pour réutiliser (ou recycler) une vue, un gestionnaire de mise en page peut demander à l'adaptateur de remplacer le contenu de la vue par un autre élément de l'ensemble de données. Le recyclage des vues de cette manière améliore les performances en évitant la création de vues inutiles ou l'exécution de recherches findViewById()
coûteuses. La bibliothèque d'assistance Android inclut trois gestionnaires de mise en page standards, chacun offrant de nombreuses options de personnalisation :
LinearLayoutManager
: organise les éléments dans une liste unidimensionnelle. L'utilisation d'un RecyclerView
avec LinearLayoutManager
fournit des fonctionnalités semblables à une mise en page ListView
.
GridLayoutManager
: organise les éléments dans une grille bidimensionnelle, comme les cases d'un damier. L'utilisation d'un RecyclerView
avec GridLayoutManager
offre des fonctionnalités semblables à une mise en page GridView
.
StaggeredGridLayoutManager
: organise les éléments dans une grille bidimensionnelle, chaque colonne étant légèrement décalée par rapport à la précédente, comme les étoiles sur un drapeau américain.
Si ces gestionnaires de mise en page ne répondent pas à vos besoins, vous pouvez créer le vôtre en étendant la classe abstraite RecyclerView.LayoutManager
.
Ajouter des animations d'éléments
Chaque fois qu'un élément change, RecyclerView
utilise un animateur pour modifier son apparence. Cet animateur est un objet qui étend la classe abstraite RecyclerView.ItemAnimator
. Par défaut, RecyclerView
utilise DefaultItemAnimator
pour fournir l'animation. Si vous souhaitez fournir des animations personnalisées, vous pouvez définir votre propre objet d'animation en étendant RecyclerView.ItemAnimator
.
Activer la sélection d'éléments de liste
La bibliothèque recyclerview-selection
permet aux utilisateurs de sélectionner des éléments dans une liste RecyclerView
à l'aide d'une entrée tactile ou de la souris. Cela vous permet de conserver le contrôle sur la présentation visuelle d'un élément sélectionné. Vous pouvez également conserver le contrôle sur les règles régissant le comportement de sélection, par exemple les éléments éligibles à la sélection et le nombre d'éléments pouvant être sélectionnés.
Pour ajouter la prise en charge de la sélection à une instance RecyclerView
, procédez comme suit :
- Déterminez le type de clé de sélection à utiliser, puis créez un
ItemKeyProvider
.
Vous pouvez utiliser trois types clés pour identifier les éléments sélectionnés :
Pour en savoir plus sur les types de clés de sélection, consultez SelectionTracker.Builder
.
- Implémenter
ItemDetailsLookup
.
ItemDetailsLookup
permet à la bibliothèque de sélection d'accéder aux informations sur les éléments RecyclerView
à partir d'un MotionEvent
.
Il s'agit en fait d'une fabrique d'instances ItemDetails
sauvegardées ou extraites d'une instance RecyclerView.ViewHolder
.
- Mettez à jour les objets
View
dans RecyclerView
pour refléter si l'utilisateur les sélectionne ou les désélectionne.
La bibliothèque de sélection ne fournit pas de décoration visuelle par défaut pour les éléments sélectionnés. Fournissez-le lorsque vous implémentez onBindViewHolder()
.
Nous vous recommandons de procéder comme suit :
- Dans
onBindViewHolder()
, appelez setActivated()
(et non
setSelected()
) sur l'objet View
avec true
ou false
, selon que l'élément est sélectionné ou non.
- Mettez à jour le style de la vue pour représenter l'état activé. Nous vous recommandons d'utiliser une ressource de liste d'état de couleur pour configurer le style.
- Utilisez
ActionMode
pour fournir à l'utilisateur des outils lui permettant d'effectuer une action sur la sélection.
Enregistrez un SelectionTracker.SelectionObserver
pour être averti lorsqu'une sélection change. Lorsqu'une sélection est créée pour la première fois, démarrez ActionMode
pour la présenter à l'utilisateur et lui proposer des actions spécifiques à la sélection. Par exemple, vous pouvez ajouter un bouton de suppression à la barre ActionMode
et connecter la flèche de retour de la barre pour effacer la sélection. Lorsque la sélection devient vide (si l'utilisateur l'a effacée la dernière fois), mettez fin au mode Action.
- Effectuez toutes les actions secondaires interprétées.
À la fin du pipeline de traitement des événements, la bibliothèque peut déterminer que l'utilisateur tente d'activer un élément en appuyant dessus, ou qu'il tente de faire glisser un élément ou un ensemble d'éléments sélectionnés. Réagissez à ces interprétations en enregistrant l'écouteur approprié. Pour en savoir plus, consultez SelectionTracker.Builder
.
- Assemblez tout avec
SelectionTracker.Builder
.
L'exemple suivant montre comment assembler ces éléments :
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();
Pour créer une instance SelectionTracker
, votre application doit fournir le même RecyclerView.Adapter
que celui que vous utilisez pour initialiser RecyclerView
sur SelectionTracker.Builder
. Pour cette raison, après avoir créé l'instance SelectionTracker
, injectez-la dans votre RecyclerView.Adapter
. Sinon, vous ne pouvez pas vérifier l'état de sélection d'un élément à partir de la méthode onBindViewHolder()
.
- Incluez la sélection dans les événements du cycle de vie de l'activité.
Pour préserver l'état de sélection lors des événements de cycle de vie de l'activité, votre application doit appeler les méthodes onSaveInstanceState()
et onRestoreInstanceState()
du sélecteur de sélection à partir des méthodes onSaveInstanceState()
et onRestoreInstanceState()
de l'activité, respectivement. Votre application doit également fournir un ID de sélection unique au constructeur SelectionTracker.Builder
. Cet ID est obligatoire, car une activité ou un fragment peuvent comporter plusieurs listes distinctes et sélectionnables, qui doivent toutes être conservées dans leur état enregistré.
Ressources supplémentaires
Pour en savoir plus, consultez les références suivantes.
Le contenu et les exemples de code de cette page sont soumis aux licences décrites dans la Licence de contenu. Java et OpenJDK sont des marques ou des marques déposées d'Oracle et/ou de ses sociétés affiliées.
Dernière mise à jour le 2025/08/27 (UTC).
[[["Facile à comprendre","easyToUnderstand","thumb-up"],["J'ai pu résoudre mon problème","solvedMyProblem","thumb-up"],["Autre","otherUp","thumb-up"]],[["Il n'y a pas l'information dont j'ai besoin","missingTheInformationINeed","thumb-down"],["Trop compliqué/Trop d'étapes","tooComplicatedTooManySteps","thumb-down"],["Obsolète","outOfDate","thumb-down"],["Problème de traduction","translationIssue","thumb-down"],["Mauvais exemple/Erreur de code","samplesCodeIssue","thumb-down"],["Autre","otherDown","thumb-down"]],["Dernière mise à jour le 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."]]