RecyclerView
est un composant View qui permet d'afficher facilement et efficacement de grands ensembles de données. Au lieu de créer des vues pour chaque élément de l'ensemble de données, RecyclerView
améliore les performances de votre application en conservant un petit pool de vues et en les recyclant lorsque vous parcourez ces éléments.
Dans Compose, vous pouvez utiliser des listes lazy pour obtenir le même résultat. Cette page explique comment migrer votre implémentation RecyclerView
pour utiliser des listes Lazy dans Compose.
Procédure de migration
Pour migrer votre implémentation RecyclerView
vers Compose, procédez comme suit :
Mettez en commentaire ou supprimez le
RecyclerView
de votre hiérarchie d'UI et ajoutez unComposeView
pour le remplacer si aucun n'est encore présent dans la hiérarchie. Voici le conteneur de la liste Lazy que vous allez ajouter :<FrameLayout android:layout_width="match_parent" android:layout_height="match_parent"> <!-- <androidx.recyclerview.widget.RecyclerView--> <!-- android:id="@+id/recycler_view"--> <!-- android:layout_width="match_parent"--> <!-- android:layout_height="match_parent />"--> <androidx.compose.ui.platform.ComposeView android:id="@+id/compose_view" android:layout_width="match_parent" android:layout_height="match_parent" /> </FrameLayout>
Déterminez le type de composable Lazy List dont vous avez besoin en fonction du gestionnaire de mise en page de votre
RecyclerView
(voir le tableau ci-dessous). Le composable que vous sélectionnez sera le composable de premier niveau duComposeView
que vous avez ajouté à l'étape précédente.LayoutManager
Composable
LinearLayoutManager
LazyColumn
ouLazyRow
GridLayoutManager
LazyVerticalGrid
ouLazyHorizontalGrid
StaggeredGridLayoutManager
LazyVerticalStaggeredGrid
ouLazyHorizontalStaggeredGrid
// recyclerView.layoutManager = LinearLayoutManager(context) composeView.setContent { LazyColumn(Modifier.fillMaxSize()) { // We use a LazyColumn since the layout manager of the RecyclerView is a vertical LinearLayoutManager } }
Créez un composable correspondant pour chaque type de vue dans votre implémentation
RecyclerView.Adapter
. Chaque type de vue correspond généralement à une sous-classeViewHolder
, mais ce n'est pas toujours le cas. Ces composables seront utilisés comme représentation de l'UI pour différents types d'éléments de votre liste :@Composable fun ListItem(data: MyData, modifier: Modifier = Modifier) { Row(modifier.fillMaxWidth()) { Text(text = data.name) // … other composables required for displaying `data` } }
La logique des méthodes
onCreateViewHolder()
etonBindViewHolder()
de votreRecyclerView.Adapter
sera remplacée par ces composables et l'état que vous leur fournissez. Dans Compose, il n'y a pas de séparation entre la création d'un composable pour un élément et la liaison de données à celui-ci : ces concepts sont fusionnés.Dans l'emplacement
content
de la liste Lazy (paramètre lambda de fin), utilisez la fonctionitems()
(ou une surcharge équivalente) pour parcourir les données de votre liste. Dans le lambdaitemContent
, appelez l'élément composable approprié pour vos données :val data = listOf<MyData>(/* ... */) composeView.setContent { LazyColumn(Modifier.fillMaxSize()) { items(data) { ListItem(it) } } }
Cas d'utilisation courants
Décorations d'articles
RecyclerView
dispose du concept d'ItemDecoration
, que vous pouvez utiliser pour ajouter un dessin spécial aux éléments de la liste. Par exemple, vous pouvez ajouter un ItemDecoration
pour ajouter des séparateurs entre les éléments :
val itemDecoration = DividerItemDecoration(recyclerView.context, LinearLayoutManager.VERTICAL) recyclerView.addItemDecoration(itemDecoration)
Compose ne dispose pas d'un concept équivalent de décorations d'éléments. Au lieu de cela, vous pouvez ajouter directement dans la composition toutes les décorations d'UI de la liste. Par exemple, pour ajouter des séparateurs à la liste, vous pouvez utiliser le composable Divider
après chaque élément :
LazyColumn(Modifier.fillMaxSize()) { itemsIndexed(data) { index, d -> ListItem(d) if (index != data.size - 1) { HorizontalDivider() } } }
Animation des éléments
Un ItemAnimator
peut être défini sur un RecyclerView
pour animer l'apparence des éléments lorsque des modifications sont apportées à l'adaptateur. Par défaut, RecyclerView
utilise DefaultItemAnimator
, qui fournit des animations de base pour les événements de suppression, d'ajout et de déplacement.
Les listes différées ont un concept similaire grâce au modificateur animateItemPlacement
.
Pour en savoir plus, consultez Animations d'éléments.
Ressources supplémentaires
Pour en savoir plus sur la migration d'un RecyclerView
vers Compose, consultez les ressources suivantes :
- Listes et grilles : documentation sur l'implémentation de listes et de grilles dans Compose.
- Interopérabilité Jetpack Compose : Utiliser Compose dans un RecyclerView : article de blog pour utiliser efficacement Compose dans un
RecyclerView
.
Recommandations personnalisées
- Remarque : Le texte du lien s'affiche lorsque JavaScript est désactivé
- Listes et grilles
- Migrer
CoordinatorLayout
vers Compose - Autres points à prendre en compte