LazyColumn in Jetpack Compose — cos’è, proprietà e come funziona

Autore: IT Sectr Pubblicato: 2026-06-29 Tempo di lettura: 11 min

LazyColumn è una funzione composable in Jetpack Compose per creare elenchi verticali con caricamento differito degli elementi. A differenza di Column, LazyColumn crea e compone solo gli elementi visibili sullo schermo, riutilizzandoli durante lo scorrimento. Secondo Google Android Documentation, 2025, LazyColumn è lo strumento principale per visualizzare grandi set di dati nelle applicazioni mobili grazie all’efficiente gestione della memoria.

Punti chiave

  • LazyColumn — un elenco verticale Jetpack Compose con caricamento differito che crea solo gli elementi visibili e li riutilizza durante lo scorrimento.
  • items accetta una raccolta di dati e una funzione factory per creare elementi dell’elenco, mentre item aggiunge componenti singoli.
  • LazyListState tiene traccia della posizione di scorrimento e consente il controllo programmatico dell’elenco tramite animateScrollToItem e scrollToItem.
  • Sticky headers fissano le intestazioni delle sezioni nella parte superiore dell’elenco durante lo scorrimento utilizzando stickyHeader.
  • LazyColumn supporta diversi tipi di elementi tramite il parametro contentType per ottimizzare il riutilizzo.

Cos’è LazyColumn in Jetpack Compose

LazyColumn è una funzione composable che implementa un elenco verticale scorrevole con caricamento differito. A differenza di Column, che rende tutti gli elementi figli in una volta, LazyColumn crea solo gli elementi che rientrano nell’area visibile.

Il meccanismo di caricamento differito in LazyColumn si basa sul riutilizzo degli elementi: quando un elemento viene nascosto durante lo scorrimento, la sua composizione e il suo layout possono essere riutilizzati per un nuovo elemento visualizzato. Ciò consente di risparmiare memoria e tempo CPU, specialmente negli elenchi lunghi.

Secondo Android Developers Blog, 2024, LazyColumn può gestire efficientemente elenchi di decine di migliaia di elementi senza un significativo degrado delle prestazioni. Ogni elemento in LazyColumn ha una chiave (key) che aiuta Compose a identificare e preservare lo stato dell’elemento quando l’elenco cambia.

Firma base di LazyColumn

LazyColumn accetta i parametri modifier, state, contentPadding, reverseLayout, verticalArrangement e horizontalAlignment. Il contenuto viene definito in un blocco lambda tramite le funzioni DSL items e item.

kotlin
@Composable
fun SimpleLazyColumn() {
    val itemsList = (1..100).toList()
    LazyColumn(
        modifier = Modifier.fillMaxSize(),
        verticalArrangement = Arrangement.spacedBy(8.dp),
        contentPadding = PaddingValues(16.dp)
    ) {
        items(itemsList) { item ->
            Text(text = "Elemento $item")
        }
    }
}

Parametri di LazyColumn: items e item

Il blocco DSL di LazyColumn fornisce le funzioni items e item per aggiungere contenuto. items accetta una raccolta di dati, una chiave e una funzione factory per creare elementi. item aggiunge un singolo elemento statico all’elenco.

itemsIndexed è una variante di items che passa l’indice dell’elemento oltre ai dati. Ciò è utile quando è necessario conoscere la posizione dell’elemento senza calcolo separato. items(size) accetta solo il numero di elementi e una factory senza vincolarsi a una raccolta.

Il parametro key in items identifica in modo univoco ogni elemento. Secondo le Material Design Guidelines, 2025, le chiavi migliorano le prestazioni durante l’aggiornamento e l’animazione degli elementi, poiché Compose può tracciare lo spostamento o la modifica di un elemento specifico tramite la sua chiave.

Esempio con diversi tipi di elementi

La funzione items con contentType consente a LazyColumn di ottimizzare il riutilizzo di elementi di diversi tipi. Nell’esempio seguente, intestazioni di sezione e righe regolari vengono utilizzate in un unico elenco.

kotlin
@Composable
fun MixedItemsList() {
    LazyColumn {
        item {
            Text(
                text = "Intestazione",
                style = MaterialTheme.typography.headlineMedium
            )
        }
        items(
            items = (1..20).toList(),
            key = { it },
            contentType = { "item" }
        ) { item ->
            Text(text = "Riga $item")
        }
    }
}

LazyListState e gestione dello scorrimento

LazyListState è un oggetto di stato di LazyColumn che tiene traccia della posizione corrente di scorrimento, del primo elemento visibile e dell’offset. Può essere creato tramite rememberLazyListState() e passato al parametro state di LazyColumn.

LazyListState fornisce i metodi animateScrollToItem e scrollToItem per lo scorrimento programmatico verso un elemento specifico. animateScrollToItem crea un’animazione di scorrimento fluida, mentre scrollToItem scorre istantaneamente. Entrambi i metodi richiedono la chiamata all’interno di una coroutine in CompositionContext.

Secondo Android Developers, 2024, LazyListState contiene anche layoutInfo, che fornisce informazioni sugli elementi visibili — i loro indici, offset e dimensioni. Ciò è utile per implementare analisi, tracciamento delle visualizzazioni o scorrimento infinito.

Esempio con scorrimento programmatico

In questo esempio, LazyColumn viene controllato tramite LazyListState. Un pulsante scorre l’elenco fino all’elemento con indice 50 con un’animazione fluida.

kotlin
@Composable
fun ScrollableList() {
    val listState = rememberLazyListState()
    val scope = rememberCoroutineScope()

    Column {
        Button(
            onClick = {
                scope.launch {
                    listState.animateScrollToItem(50)
                }
            }
        ) {
            Text("Scorri a 50")
        }

        LazyColumn(state = listState) {
            items((1..100).toList()) { item ->
                Text(
                    text = "Elemento $item",
                    modifier = Modifier.padding(8.dp)
                )
            }
        }
    }
}

Ottimizzazione delle prestazioni di LazyColumn

Il fattore chiave delle prestazioni di LazyColumn è l’uso corretto delle chiavi. Ogni elemento dovrebbe avere una chiave stabile univoca tramite il parametro key. Senza chiavi, Compose non può riutilizzare correttamente gli elementi quando i dati cambiano, portando alla ricomposizione.

contentType comunica a LazyColumn quali elementi hanno lo stesso tipo di layout. Quando due elementi con lo stesso contentType entrano nel pool di riciclo, LazyColumn può riutilizzare il loro layout senza ricomposizione. Secondo Android Developers Blog, 2024, contentType migliora le prestazioni del 30–50% negli elenchi con diversi tipi di elementi.

Per LazyColumn, è anche importante evitare parametri instabili nelle funzioni factory. Ogni volta che un parametro di un elemento cambia, Compose ricompone quell’elemento. L’uso di remember e derivedStateOf per valori stabili riduce il numero di ricomposizioni.

Tabella dei fattori di prestazione

FattoreImpattoRaccomandazione
Chiavi (key)CriticoImposta sempre una chiave stabile univoca per items
contentTypeSignificativoSpecifica il tipo di elemento per ottimizzare il riutilizzo
Dimensione elementiModeratoUtilizza dimensioni fisse dove possibile
Elenchi annidatiCriticoEvita LazyColumn dentro LazyColumn — usa LazyVerticalGrid

Sticky headers e sezioni in LazyColumn

stickyHeader è una funzione DSL di LazyColumn che fissa un’intestazione di sezione nella parte superiore dell’elenco durante lo scorrimento. Quando la sezione successiva raggiunge la parte superiore, la sua intestazione sostituisce quella corrente. Questo comportamento è familiare agli utenti dagli elenchi di contatti e calendari.

stickyHeader accetta una chiave e una funzione factory, simile a item. A differenza di un item normale, stickyHeader rimane visibile mentre si scorre attraverso il contenuto della sua sezione. Quando una sezione viene completamente scorsa, l’intestazione della sezione successiva spinge via quella precedente.

Secondo le Material Design Guidelines, 2025, gli sticky header migliorano la navigazione negli elenchi lunghi e riducono il carico cognitivo dell’utente. Per implementare uno sticky header, basta avvolgere un’intestazione di sezione in stickyHeader nella posizione corretta rispetto agli elementi items.

kotlin
@Composable
fun SectionedList(sections: Map<String, List<String>>) {
    LazyColumn {
        sections.forEach { (header, items) ->
            stickyHeader {
                Text(
                    text = header,
                    modifier = Modifier.background(Color.White)
                        .padding(16.dp)
                )
            }
            items(items) { item ->
                Text(text = item, modifier = Modifier.padding(8.dp))
            }
        }
    }
}

Domande frequenti

In cosa differisce LazyColumn da Column in Compose?

Column rende tutti gli elementi in una volta ed è adatto per elenchi fino a 20–30 elementi. LazyColumn crea solo gli elementi visibili e li riutilizza durante lo scorrimento, consentendo di lavorare con migliaia di elementi senza perdita di prestazioni.

Come aggiungere separatori tra gli elementi di LazyColumn?

Utilizza Arrangement.spacedBy nel parametro verticalArrangement o funzioni items con un separatore tramite indice. Per separatori complessi, aggiungi un item separato con Divider() tra gli elementi dell’elenco.

Come aggiornare LazyColumn quando i dati cambiano?

LazyColumn si ricompone automaticamente quando la raccolta dati cambia, se vengono utilizzate chiavi stabili. I cambiamenti nei dati rilevati tramite mutableStateListOf o StateFlow causano il ridisegno solo degli elementi modificati.

Si può annidare LazyColumn dentro LazyColumn?

L’annidamento diretto di LazyColumn dentro LazyColumn non è raccomandato — entrambi hanno scorrimento indipendente, creando conflitti di gesti. Invece, usa un Column normale con LazyColumn all’interno di una Section scorrevole o LazyVerticalGrid per griglie.

Come rilevare che LazyColumn è stato scorso fino alla fine?

Utilizza LazyListState.layoutInfo.visibleItemsInfo e confronta l’indice dell’ultimo elemento visibile con il numero totale di elementi. Per lo scorrimento infinito, monitora quando l’ultimo elemento visibile si avvicina alla fine dell’elenco.

Riepilogo

  • LazyColumn — un elenco verticale con caricamento differito che crea e riutilizza solo gli elementi nell’area visibile per lavorare efficientemente con grandi dati.
  • items e item — funzioni DSL per aggiungere raccolte di dati e componenti singoli a LazyColumn con supporto di chiave e contentType.
  • LazyListState gestisce la posizione di scorrimento, fornendo navigazione programmatica tramite animateScrollToItem e scrollToItem nelle coroutine.
  • contentType e key — i principali strumenti di ottimizzazione delle prestazioni, riducendo la ricomposizione e migliorando il riutilizzo degli elementi.
  • stickyHeader fissa le intestazioni di sezione nella parte superiore dell’elenco, migliorando la navigazione in elenchi lunghi con dati raggruppati.
  • Arrangement.spacedBy e contentPadding gestiscono la spaziatura tra elementi e bordi di LazyColumn per la conformità con Material Design.
  • Per elenchi orizzontali con caricamento differito, usa LazyRow e per griglie — LazyVerticalGrid, seguendo lo stesso principio di caricamento differito.

Svilupperemo un'applicazione mobile chiavi in mano

IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.

Discuti il progetto

Leggi anche