LazyRow en Jetpack Compose — qué es, propiedades y cómo funciona

Autor: IT Sectr Publicado: 2026-06-29 Tiempo de lectura: 10 min

LazyRow — es una función composable en Jetpack Compose para crear listas horizontales con carga diferida de elementos. A diferencia de Row, LazyRow crea solo los elementos visibles y los reutiliza durante el desplazamiento horizontal. Según Google Android Documentation, 2025, LazyRow es el equivalente horizontal de LazyColumn y es eficaz para carruseles, galerías y menús horizontales en aplicaciones móviles.

Puntos clave

  • LazyRow — lista horizontal de Jetpack Compose con carga diferida, que crea solo los elementos visibles durante el desplazamiento horizontal.
  • horizontalArrangement gestiona la disposición horizontal de los elementos, mientras que contentPadding añade relleno en los bordes del contenedor.
  • LazyListState rastrea la posición del desplazamiento horizontal y proporciona control programático mediante animateScrollToItem.
  • LazyRow es eficaz para carruseles de imágenes, listas de categorías, galerías horizontales y pestañas en interfaces móviles.
  • contentType y key optimizan la reutilización de elementos en LazyRow, reduciendo la recomposición durante el desplazamiento.

Qué es LazyRow en Jetpack Compose

LazyRow — es una función composable que implementa una lista horizontal desplazable con carga diferida de elementos. A diferencia de Row, que renderiza todos los elementos secundarios simultáneamente, LazyRow crea solo los elementos visibles en el área de visualización.

LazyRow funciona con el mismo principio que LazyColumn, pero dispone los elementos horizontalmente. Al desplazarse hacia la izquierda o la derecha, los elementos que salen del área de visualización se reutilizan para mostrar otros nuevos. Esto es críticamente importante para galerías con muchas imágenes o listas largas de categorías.

Según Android Developers Blog, 2024, LazyRow utiliza la misma arquitectura LazyList que LazyColumn, incluyendo LazyListState, el mecanismo de reutilización mediante Pool y el soporte para diferentes tipos de elementos. La máxima eficiencia se logra con una altura fija de los elementos.

Firma básica de LazyRow

LazyRow acepta los parámetros modifier, state, contentPadding, reverseLayout, horizontalArrangement y verticalAlignment. El contenido se define mediante las funciones DSL items y item, similar a LazyColumn.

kotlin
@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))
            }
        }
    }
}

Propiedades de LazyRow: horizontalArrangement y contentPadding

horizontalArrangement gestiona la distribución de los elementos a lo largo del eje horizontal dentro de LazyRow. Están disponibles los mismos valores de Arrangement que en Row: Start, Center, End, SpaceBetween, SpaceEvenly, SpaceAround y spacedBy con espaciado personalizado.

contentPadding añade relleno en los bordes del contenedor LazyRow. A diferencia de Modifier.padding, contentPadding se tiene en cuenta durante el desplazamiento: el primer elemento tendrá relleno desde el borde izquierdo, el último desde el borde derecho. Según Material Design Guidelines, 2025, contentPadding es obligatorio para carruseles y galerías para que el primer y último elemento no se adhieran al borde de la pantalla.

verticalAlignment alinea los elementos verticalmente dentro de LazyRow. Por defecto se usa Alignment.Top. Para centrar elementos de diferentes alturas, use Alignment.CenterVertically, lo que es útil para carruseles con imágenes de diferentes proporciones.

Tabla de parámetros de LazyRow

ParámetroDescripciónValor predeterminado
horizontalArrangementDistribución horizontal de elementosArrangement.Start
contentPaddingRelleno en los bordes del contenedorPaddingValues(0.dp)
verticalAlignmentAlineación verticalAlignment.Top
reverseLayoutOrden inverso de elementosfalse
userScrollEnabledHabilitar desplazamiento del usuariotrue

Gestión del desplazamiento horizontal con LazyListState

LazyListState para LazyRow funciona de forma idéntica a LazyColumn: rastrea el primer elemento visible, el desplazamiento y la posición general de desplazamiento. El estado se crea mediante rememberLazyListState() y se pasa al parámetro state.

El control programático del desplazamiento de LazyRow se realiza con los mismos métodos: animateScrollToItem para animación suave y scrollToItem para desplazamiento instantáneo. Ambos se llaman dentro de una corrutina. Esto es útil para carruseles con botones de avance/retroceso o para desplazamiento automático.

Según Android Developers, 2024, LazyRow también admite SnapFlingBehavior — un comportamiento para desplazamiento rápido que se detiene en el elemento más cercano en lugar de entre elementos. Esto crea un efecto de ajuste familiar para carruseles y galerías.

kotlin
@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("Para empezar") }
        }
    }
}

Ejemplos de uso de LazyRow en interfaces

El primer ejemplo — LazyRow para una galería de imágenes con vistas previas. Cada elemento es un Box con una imagen y un pie de foto. LazyRow maneja eficientemente decenas y cientos de imágenes, cargando solo las visibles.

kotlin
@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)
            )
        }
    }
}

El segundo ejemplo — LazyRow para una lista de categorías con iconos. Las categorías se muestran como chips y el usuario puede desplazarlas horizontalmente. LazyRow con spacedBy y contentPadding crea espaciado entre categorías y en los bordes.

kotlin
@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) }
            )
        }
    }
}

LazyRow vs Row: cuándo elegir cada uno

La elección entre LazyRow y Row depende del número de elementos. Row es adecuado para 5–10 elementos que siempre están visibles en la pantalla. LazyRow es esencial cuando hay muchos elementos o su cantidad es dinámica.

Row renderiza todos los elementos a la vez, lo que provoca retrasos con una gran cantidad de elementos. LazyRow renderiza solo los visibles, lo que lo hace preferible para listas desplazables. Según Android Developers Blog, 2024, el umbral es de aproximadamente 10 elementos: si hay más elementos, use LazyRow.

LazyRow también admite animaciones, SnapFlingBehavior y agrupación mediante separadores, lo que lo hace más flexible para interfaces complejas. Row es más simple y no requiere LazyListState, pero no está optimizado para listas largas.

  • Row — para 5–10 elementos estáticos sin desplazamiento
  • LazyRow — para 10+ elementos con desplazamiento horizontal
  • LazyRow — para carruseles, galerías, listas dinámicas

Preguntas frecuentes

¿En qué se diferencia LazyRow de LazyColumn?

LazyRow se desplaza horizontalmente y dispone los elementos de izquierda a derecha, mientras que LazyColumn se desplaza verticalmente de arriba a abajo. Ambos utilizan los mismos principios de carga diferida, LazyListState y funciones DSL items.

¿Cómo añadir SnapFlingBehavior a LazyRow?

Pase SnapFlingBehavior(listState) al parámetro flingBehavior de LazyRow. SnapFlingBehavior obliga a LazyRow a detenerse en el elemento más cercano en lugar de entre elementos, creando un efecto de ajuste para carruseles.

¿Cómo hacer LazyRow con desplazamiento infinito?

Rastree el último elemento visible mediante LazyListState.layoutInfo y cargue nuevos datos cuando el último elemento se acerque al final de la lista. Para desplazamiento circular, use una implementación personalizada con duplicación de elementos.

¿Se puede usar LazyRow dentro de LazyColumn?

Sí, LazyRow se puede anidar dentro de LazyColumn. Este es un patrón estándar para crear páginas complejas con carruseles horizontales dentro de una lista vertical. Cada LazyRow debe tener una altura fija para un funcionamiento correcto.

¿Cómo detectar que LazyRow se ha desplazado hasta el final?

Use LazyListState.layoutInfo.visibleItemsInfo y compare el índice del último elemento visible con el total menos uno. Cuando estos valores coinciden, LazyRow está al final de la lista.

Resumen

  • LazyRow — lista horizontal con carga diferida, que crea solo elementos visibles y los reutiliza durante el desplazamiento para manejar eficientemente grandes volúmenes de datos.
  • horizontalArrangement gestiona la distribución horizontal de elementos, mientras que contentPadding añade relleno en los bordes para una visualización correcta según Material Design.
  • LazyListState proporciona control programático del desplazamiento mediante animateScrollToItem y admite SnapFlingBehavior para ajuste a elementos.
  • LazyRow es eficaz para carruseles de imágenes, galerías, listas de categorías, pestañas y menús horizontales en interfaces móviles.
  • contentType y key son las principales herramientas de optimización que reducen la recomposición y mejoran la reutilización de elementos en LazyRow.
  • Row es adecuado para 5–10 elementos estáticos, LazyRow — para listas horizontales dinámicas o largas con desplazamiento.
  • LazyRow se puede anidar dentro de LazyColumn para crear diseños complejos con carruseles horizontales dentro de una lista vertical.

Desarrollaremos una aplicación móvil llave en mano

IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.

Discutir el proyecto

Lea también