Saltar a contenido

6.1 Listas con LazyColumn

Una Column dibuja todos sus hijos a la vez; con mil elementos la app iría lenta. LazyColumn solo dibuja los que se ven en pantalla y los recicla al hacer scroll.

val frutas = listOf("Manzana", "Pera", "Plátano", "Fresa", "Uva")

LazyColumn {
    items(frutas) { fruta ->
        Text(fruta, Modifier.padding(16.dp))
    }
}

Elementos con aspecto propio

Lo normal es que cada fila sea su propio composable:

data class Contacto(val nombre: String, val telefono: String)

@Composable
fun FilaContacto(c: Contacto) {
    Row(Modifier.fillMaxWidth().padding(12.dp), verticalAlignment = Alignment.CenterVertically) {
        Icon(Icons.Default.Person, contentDescription = null, Modifier.size(40.dp))
        Spacer(Modifier.width(12.dp))
        Column {
            Text(c.nombre, fontWeight = FontWeight.Bold)
            Text(c.telefono, style = MaterialTheme.typography.bodySmall)
        }
    }
}

LazyColumn {
    items(contactos) { FilaContacto(it) }
}

Cabeceras, separadores y espacio

LazyColumn(
    contentPadding = PaddingValues(16.dp),
    verticalArrangement = Arrangement.spacedBy(8.dp)
) {
    item { Text("Mis contactos", style = MaterialTheme.typography.headlineSmall) }
    items(contactos) { FilaContacto(it) }
    item { Text("Fin de la lista") }
}
  • item { } añade un elemento suelto; items(lista) { } añade uno por cada elemento.
  • stickyHeader { } crea una cabecera que se queda fijada arriba al desplazar.

Otras listas

Composable Para qué
LazyRow Lista horizontal
LazyVerticalGrid(columns = GridCells.Fixed(2)) Cuadrícula
Column(Modifier.verticalScroll(rememberScrollState())) Pocos elementos que no caben en pantalla