LazyColumn no Jetpack Compose — o que é, propriedades e como funciona

Autor: IT Sectr Publicado: 2026-06-29 Tempo de leitura: 11 min

LazyColumn é uma função composable no Jetpack Compose para criar listas verticais com carregamento diferido de elementos. Ao contrário do Column, o LazyColumn cria e compõe apenas os elementos visíveis na tela, reutilizando-os durante a rolagem. De acordo com o Google Android Documentation, 2025, o LazyColumn é a principal ferramenta para exibir grandes conjuntos de dados em aplicativos móveis graças ao gerenciamento eficiente de memória.

Principais conclusões

  • LazyColumn — uma lista vertical do Jetpack Compose com carregamento diferido que cria apenas elementos visíveis e os reutiliza durante a rolagem.
  • items aceita uma coleção de dados e uma função fábrica para criar itens da lista, enquanto item adiciona componentes individuais.
  • LazyListState rastreia a posição de rolagem e permite o controle programático da lista por meio de animateScrollToItem e scrollToItem.
  • Sticky headers fixam os cabeçalhos das seções no topo da lista durante a rolagem usando stickyHeader.
  • LazyColumn suporta diferentes tipos de elementos por meio do parâmetro contentType para otimizar a reutilização.

O que é LazyColumn no Jetpack Compose

LazyColumn é uma função composable que implementa uma lista vertical rolável com carregamento diferido. Ao contrário do Column, que renderiza todos os filhos de uma vez, o LazyColumn cria apenas os elementos que estão dentro da viewport.

O mecanismo de carregamento diferido no LazyColumn é baseado na reutilização de elementos: quando um elemento é ocultado durante a rolagem, sua composição e layout podem ser reutilizados para um novo elemento exibido. Isso economiza memória e tempo de CPU, especialmente em listas longas.

De acordo com o Android Developers Blog, 2024, o LazyColumn pode lidar eficientemente com listas de dezenas de milhares de elementos sem degradação significativa de desempenho. Cada elemento no LazyColumn tem uma chave (key) que ajuda o Compose a identificar e preservar o estado do elemento quando a lista muda.

Assinatura básica do LazyColumn

LazyColumn aceita os parâmetros modifier, state, contentPadding, reverseLayout, verticalArrangement e horizontalAlignment. O conteúdo é definido em um bloco lambda por meio das funções 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 = "Item $item")
        }
    }
}

Parâmetros do LazyColumn: items e item

O bloco DSL do LazyColumn fornece as funções items e item para adicionar conteúdo. items aceita uma coleção de dados, uma chave e uma função fábrica para criar elementos. item adiciona um único elemento estático à lista.

itemsIndexed é uma variante de items que passa o índice do elemento além dos dados. Isso é útil quando você precisa saber a posição do elemento sem cálculo separado. items(size) aceita apenas o número de elementos e uma fábrica sem vincular a uma coleção.

O parâmetro key em items identifica exclusivamente cada elemento. De acordo com as Material Design Guidelines, 2025, as chaves melhoram o desempenho ao atualizar e animar elementos, pois o Compose pode rastrear o movimento ou alteração de um elemento específico pela chave.

Exemplo com diferentes tipos de elementos

A função items com contentType permite que o LazyColumn otimize a reutilização de elementos de diferentes tipos. No exemplo abaixo, cabeçalhos de seção e linhas regulares são usados em uma única lista.

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

LazyListState e gerenciamento de rolagem

LazyListState é um objeto de estado do LazyColumn que rastreia a posição atual de rolagem, o primeiro elemento visível e o deslocamento. Pode ser criado por meio de rememberLazyListState() e passado para o parâmetro state do LazyColumn.

LazyListState fornece os métodos animateScrollToItem e scrollToItem para rolagem programática até um elemento específico. animateScrollToItem cria uma animação suave de rolagem, enquanto scrollToItem rola instantaneamente. Ambos os métodos exigem chamada dentro de uma corrotina no CompositionContext.

De acordo com Android Developers, 2024, o LazyListState também contém layoutInfo, que fornece informações sobre os elementos visíveis — seus índices, deslocamentos e tamanhos. Isso é útil para implementar análises, rastreamento de visualizações ou rolagem infinita.

Exemplo com rolagem programática

Neste exemplo, o LazyColumn é controlado por meio do LazyListState. Um botão rola a lista até o elemento com índice 50 com uma animação suave.

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

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

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

Otimização de desempenho do LazyColumn

O principal fator de desempenho do LazyColumn é o uso correto de chaves. Cada elemento deve ter uma chave estável única por meio do parâmetro key. Sem chaves, o Compose não pode reutilizar corretamente os elementos quando os dados mudam, levando à recomposição.

contentType informa ao LazyColumn quais elementos têm o mesmo tipo de layout. Quando dois elementos com o mesmo contentType entram no pool de reciclagem, o LazyColumn pode reutilizar seu layout sem recomposição. De acordo com o Android Developers Blog, 2024, o contentType melhora o desempenho em 30–50% em listas com diferentes tipos de elementos.

Para o LazyColumn, também é importante evitar parâmetros instáveis em funções fábrica. Cada vez que um parâmetro de elemento muda, o Compose recompõe esse elemento. Usar remember e derivedStateOf para valores estáveis reduz o número de recomposições.

Tabela de fatores de desempenho

FatorImpactoRecomendação
Chaves (key)CríticoSempre defina uma chave estável única para items
contentTypeSignificativoEspecifique o tipo de elemento para otimizar a reutilização
Tamanho dos elementosModeradoUse tamanhos fixos quando possível
Listas aninhadasCríticoEvite LazyColumn dentro de LazyColumn — use LazyVerticalGrid

Sticky headers e seções no LazyColumn

stickyHeader é uma função DSL do LazyColumn que fixa um cabeçalho de seção no topo da lista durante a rolagem. Quando a próxima seção atinge o topo, seu cabeçalho substitui o atual. Esse comportamento é familiar aos usuários de listas de contatos e calendários.

stickyHeader aceita uma chave e uma função fábrica, semelhante ao item. Ao contrário de um item normal, o stickyHeader permanece visível enquanto rola pelo conteúdo de sua seção. Quando uma seção é totalmente rolada, o cabeçalho da próxima seção empurra o anterior para fora.

De acordo com as Material Design Guidelines, 2025, os sticky headers melhoram a navegação em listas longas e reduzem a carga cognitiva do usuário. Para implementar um sticky header, basta envolver um cabeçalho de seção em stickyHeader na posição correta em relação aos elementos 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))
            }
        }
    }
}

Perguntas frequentes

Como o LazyColumn difere do Column no Compose?

Column renderiza todos os elementos de uma vez e é adequado para listas de até 20–30 elementos. O LazyColumn cria apenas os elementos visíveis e os reutiliza durante a rolagem, permitindo trabalhar com milhares de elementos sem perda de desempenho.

Como adicionar separadores entre elementos do LazyColumn?

Use Arrangement.spacedBy no parâmetro verticalArrangement ou funções items com um separador por meio de índice. Para separadores complexos, adicione um item separado com Divider() entre os elementos da lista.

Como atualizar o LazyColumn quando os dados mudam?

LazyColumn recompõe automaticamente quando a coleção de dados muda, se chaves estáveis forem usadas. Alterações de dados detectadas por meio de mutableStateListOf ou StateFlow fazem com que apenas os elementos alterados sejam redesenhados.

Pode-se aninhar LazyColumn dentro de LazyColumn?

O aninhamento direto de LazyColumn dentro de LazyColumn não é recomendado — ambas têm rolagem independente, criando conflitos de gestos. Em vez disso, use um Column comum com LazyColumn dentro de uma Section rolável ou LazyVerticalGrid para grades.

Como detectar que o LazyColumn rolou até o final?

Use LazyListState.layoutInfo.visibleItemsInfo e compare o índice do último elemento visível com o número total de elementos. Para rolagem infinita, rastreie quando o último elemento visível se aproxima do final da lista.

Resumo

  • LazyColumn — uma lista vertical com carregamento diferido que cria e reutiliza apenas elementos na viewport para trabalhar eficientemente com grandes dados.
  • items e item — funções DSL para adicionar coleções de dados e componentes individuais ao LazyColumn com suporte a chave e contentType.
  • LazyListState gerencia a posição de rolagem, fornecendo navegação programática por meio de animateScrollToItem e scrollToItem em corrotinas.
  • contentType e key — as principais ferramentas de otimização de desempenho, reduzindo a recomposição e melhorando a reutilização de elementos.
  • stickyHeader fixa os cabeçalhos de seção no topo da lista, melhorando a navegação em listas longas com dados agrupados.
  • Arrangement.spacedBy e contentPadding gerenciam o espaçamento entre elementos e bordas do LazyColumn para conformidade com o Material Design.
  • Para listas horizontais com carregamento diferido, use LazyRow, e para grades — LazyVerticalGrid, seguindo o mesmo princípio de carregamento diferido.

Vamos desenvolver um aplicativo móvel chave na mão

A IT Sectr cria aplicativos para iOS e Android para startups e empresas desde 2017. Nós vamos aconselhá-lo e propor a melhor solução.

Discutir o projeto

Leia também