LazyRow — est une fonction compostable dans Jetpack Compose pour créer des listes horizontales avec chargement différé des éléments. Contrairement à Row, LazyRow crée uniquement les éléments visibles et les réutilise lors du défilement horizontal. Selon Google Android Documentation, 2025, LazyRow est l'équivalent horizontal de LazyColumn et est efficace pour les carrousels, galeries et menus horizontaux dans les applications mobiles.
Points clés
LazyRow — est une fonction compostable implémentant une liste horizontale défilable avec chargement différé des éléments. Contrairement à Row qui rend tous les éléments enfants simultanément, LazyRow crée uniquement les éléments visibles dans la zone d'affichage.
LazyRow fonctionne sur le même principe que LazyColumn, mais dispose les éléments horizontalement. En défilant vers la gauche ou la droite, les éléments qui sortent de la zone d'affichage sont réutilisés pour afficher de nouveaux éléments. Ceci est crucial pour les galeries avec de nombreuses images ou les longues listes de catégories.
Selon Android Developers Blog, 2024, LazyRow utilise la même architecture LazyList que LazyColumn, incluant LazyListState, le mécanisme de réutilisation via Pool et la prise en charge de différents types d'éléments. L'efficacité maximale est atteinte avec une hauteur fixe des éléments.
LazyRow accepte les paramètres modifier, state, contentPadding, reverseLayout, horizontalArrangement et verticalAlignment. Le contenu est défini via les fonctions DSL items et item, similaire à LazyColumn.
@Composable
fun SimpleLazyRow() {
val items = (1..50).toList()
LazyRow(
modifier = Modifier.fillMaxWidth().height(100.dp),
horizontalArrangement = Arrangement.spacedBy(8.dp),
contentPadding = PaddingValues(start = 16.dp, end = 16.dp)
) {
items(items) { item ->
Box(
modifier = Modifier.size(80.dp).background(Color.Gray)
) {
Text(text = "$item", modifier = Modifier.align(Alignment.Center))
}
}
}
}
horizontalArrangement gère la distribution des éléments le long de l'axe horizontal dans LazyRow. Les mêmes valeurs Arrangement que dans Row sont disponibles: Start, Center, End, SpaceBetween, SpaceEvenly, SpaceAround et spacedBy avec espacement personnalisé.
contentPadding ajoute du remplissage sur les bords du conteneur LazyRow. Contrairement à Modifier.padding, contentPadding est pris en compte lors du défilement: le premier élément aura un remplissage depuis le bord gauche, le dernier depuis le bord droit. Selon Material Design Guidelines, 2025, contentPadding est obligatoire pour les carrousels et galeries afin que le premier et le dernier élément ne collent pas au bord de l'écran.
verticalAlignment aligne les éléments verticalement dans LazyRow. Par défaut, Alignment.Top est utilisé. Pour centrer des éléments de différentes hauteurs, utilisez Alignment.CenterVertically, ce qui est utile pour les carrousels avec des images de différents ratios.
| Paramètre | Description | Valeur par défaut |
|---|---|---|
| horizontalArrangement | Distribution horizontale des éléments | Arrangement.Start |
| contentPadding | Remplissage sur les bords du conteneur | PaddingValues(0.dp) |
| verticalAlignment | Alignement vertical | Alignment.Top |
| reverseLayout | Ordre inversé des éléments | false |
| userScrollEnabled | Activer le défilement utilisateur | true |
LazyListState pour LazyRow fonctionne identiquement à LazyColumn: il suit le premier élément visible, le décalage et la position générale de défilement. L'état est créé via rememberLazyListState() et passé au paramètre state.
Le contrôle programmatique du défilement de LazyRow se fait avec les mêmes méthodes: animateScrollToItem pour une animation fluide et scrollToItem pour un défilement instantané. Les deux sont appelés dans une coroutine. Ceci est utile pour les carrousels avec des boutons de navigation ou pour le défilement automatique.
Selon Android Developers, 2024, LazyRow prend également en charge SnapFlingBehavior — un comportement de défilement rapide qui s'arrête sur l'élément le plus proche plutôt qu'entre les éléments. Cela crée un effet d'accrochage familier pour les carrousels et galeries.
@Composable
fun CarouselWithSnap() {
val listState = rememberLazyListState()
val scope = rememberCoroutineScope()
val items = listOf("A", "B", "C", "D", "E")
Column {
LazyRow(
state = listState,
flingBehavior = SnapFlingBehavior(listState),
horizontalArrangement = Arrangement.spacedBy(8.dp)
) {
items(items) { item ->
Card(modifier = Modifier.width(150.dp)) {
Text(text = item, modifier = Modifier.padding(16.dp))
}
}
}
Row(modifier = Modifier.fillMaxWidth()) {
Button(onClick = {
scope.launch {
listState.animateScrollToItem(0)
}
}) { Text("Pour commencer") }
}
}
}
Le premier exemple — LazyRow pour une galerie d'images avec aperçus. Chaque élément est une Box avec une image et une légende. LazyRow gère efficacement des dizaines et des centaines d'images, ne chargeant que les visibles.
@Composable
fun ImageGallery(images: List<String>) {
LazyRow(
contentPadding = PaddingValues(start = 16.dp, end = 16.dp),
horizontalArrangement = Arrangement.spacedBy(12.dp)
) {
items(images, key = { it }) { url ->
AsyncImage(
model = url,
contentDescription = "Image",
modifier = Modifier.size(120.dp)
)
}
}
}
Le deuxième exemple — LazyRow pour une liste de catégories avec icônes. Les catégories sont affichées sous forme de chips et l'utilisateur peut les faire défiler horizontalement. LazyRow avec spacedBy et contentPadding crée un espacement entre les catégories et sur les bords.
@Composable
fun CategoryChips(categories: List<String>) {
LazyRow(
contentPadding = PaddingValues(horizontal = 16.dp),
horizontalArrangement = Arrangement.spacedBy(8.dp)
) {
items(categories, key = { it }) { category ->
AssistChip(
onClick = {},
label = { Text(category) }
)
}
}
}
Le choix entre LazyRow et Row dépend du nombre d'éléments. Row convient pour 5–10 éléments toujours visibles à l'écran. LazyRow est essentiel lorsqu'il y a beaucoup d'éléments ou que leur nombre est dynamique.
Row rend tous les éléments à la fois, ce qui cause des ralentissements avec un grand nombre d'éléments. LazyRow ne rend que les visibles, ce qui le rend préférable pour les listes défilables. Selon Android Developers Blog, 2024, le seuil est d'environ 10 éléments: s'il y a plus d'éléments, utilisez LazyRow.
LazyRow prend également en charge les animations, SnapFlingBehavior et le regroupement via des séparateurs, ce qui le rend plus flexible pour les interfaces complexes. Row est plus simple et ne nécessite pas LazyListState, mais n'est pas optimisé pour les longues listes.
Questions fréquentes
LazyRow défile horizontalement et dispose les éléments de gauche à droite, tandis que LazyColumn défile verticalement de haut en bas. Les deux utilisent les mêmes principes de chargement différé, LazyListState et fonctions DSL items.
Passez SnapFlingBehavior(listState) au paramètre flingBehavior de LazyRow. SnapFlingBehavior force LazyRow à s'arrêter sur l'élément le plus proche plutôt qu'entre les éléments, créant un effet d'accrochage pour les carrousels.
Suivez le dernier élément visible via LazyListState.layoutInfo et chargez de nouvelles données lorsque le dernier élément approche de la fin de la liste. Pour le défilement circulaire, utilisez une implémentation personnalisée avec duplication d'éléments.
Oui, LazyRow peut être imbriqué dans LazyColumn. C'est un modèle standard pour créer des pages complexes avec des carrousels horizontaux dans une liste verticale. Chaque LazyRow doit avoir une hauteur fixe pour un fonctionnement correct.
Utilisez LazyListState.layoutInfo.visibleItemsInfo et comparez l'indice du dernier élément visible avec le total moins un. Lorsque ces valeurs coïncident, LazyRow est à la fin de la liste.
Résumé
Nous développerons une application mobile clé en main
IT Sectr crée des applications iOS et Android pour les startups et les entreprises depuis 2017. Nous vous conseillerons et vous proposerons la meilleure solution.
Lisez aussi