LazyColumn в Jetpack Compose — какво е, свойства и как работи

Автор: IT Sectr Публикувано: 2026-06-29 Време за четене: 11 мин

LazyColumn е composable функция в Jetpack Compose за създаване на вертикални списъци с мързеливо зареждане на елементи. За разлика от Column, LazyColumn създава и композира само видимите на екрана елементи, като ги използва повторно при превъртане. Според Google Android Documentation, 2025, LazyColumn е основният инструмент за показване на големи набори от данни в мобилни приложения благодарение на ефективното управление на паметта.

Основни точки

  • LazyColumn е вертикален списък на Jetpack Compose с мързеливо зареждане, който създава само видимите елементи и ги използва повторно при превъртане.
  • items приема колекция от данни и фабрична функция за създаване на елементи от списъка, а item добавя единични компоненти.
  • LazyListState проследява позицията на превъртане и позволява програмно управление на списъка чрез animateScrollToItem и scrollToItem.
  • Sticky headers закрепват заглавните части на секциите в горната част на списъка при превъртане с помощта на stickyHeader.
  • LazyColumn поддържа различни типове елементи чрез параметъра contentType за оптимизиране на повторното използване.

Какво е LazyColumn в Jetpack Compose

LazyColumn е composable функция, която имплементира вертикален превъртащ се списък с мързеливо зареждане. За разлика от Column, който веднага рендерира всички дъщерни елементи, LazyColumn създава само елементите, които попадат в зоната на видимост.

Механизмът на мързеливо зареждане в LazyColumn се основава на повторно използване на елементи: когато даден елемент се скрие при превъртане, неговата композиция и оформление могат да бъдат използвани повторно за нов показан елемент. Това спестява памет и процесорно време, особено при дълги списъци.

Според Android Developers Blog, 2024, LazyColumn може ефективно да обработва списъци от десетки хиляди елементи без значително намаляване на производителността. Всеки елемент в LazyColumn има ключ (key), който помага на Compose да идентифицира и запази състоянието на елемента при промени в списъка.

Основен подпис на LazyColumn

LazyColumn приема параметрите modifier, state, contentPadding, reverseLayout, verticalArrangement и horizontalAlignment. Съдържанието се задава в ламбда блок чрез DSL функциите items и 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")
        }
    }
}

Параметри на LazyColumn: items и item

DSL блокът на LazyColumn предоставя функциите items и item за добавяне на съдържание. items приема колекция от данни, ключ и фабрична функция за създаване на елементи. item добавя един статичен елемент в списъка.

itemsIndexed е вариант на items, който освен данните предава и индекса на елемента. Това е полезно, когато позицията на елемента е необходима без отделно изчисление. items(size) приема само броя на елементите и фабриката без обвързване с колекция.

Параметърът key в items уникално идентифицира всеки елемент. Според Material Design Guidelines, 2025, ключовете подобряват производителността при актуализиране и анимиране на елементи, тъй като Compose може да проследи преместването или промяната на конкретен елемент чрез ключа.

Пример с различни типове елементи

Функцията items с contentType позволява на LazyColumn да оптимизира повторното използване на елементи от различни типове. В примера по-долу, в един списък се използват заглавни части на секции и обикновени редове.

kotlin
@Composable
fun MixedItemsList() {
    LazyColumn {
        item {
            Text(
                text = "Заглавие",
                style = MaterialTheme.typography.headlineMedium
            )
        }
        items(
            items = (1..20).toList(),
            key = { it },
            contentType = { "item" }
        ) { item ->
            Text(text = "Ред $item")
        }
    }
}

LazyListState и управление на превъртането

LazyListState е обект на състоянието на LazyColumn, който проследява текущата позиция на превъртане, първия видим елемент и отместването. Може да бъде създаден чрез rememberLazyListState() и предаден на параметъра state на LazyColumn.

LazyListState предоставя методите animateScrollToItem и scrollToItem за програмно превъртане до определен елемент. animateScrollToItem създава плавна анимация на превъртане, докато scrollToItem превърта незабавно. И двата метода изискват извикване вътре в корутина в CompositionContext.

Според Android Developers, 2024, LazyListState също така съдържа layoutInfo, който предоставя информация за видимите елементи — техните индекси, отмествания и размери. Това е полезно за внедряване на аналитика, проследяване на прегледи или безкрайно превъртане.

Пример с програмно превъртане

В този пример LazyColumn се управлява чрез LazyListState. Бутон превърта списъка до елемента с индекс 50 с плавна анимация.

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

    Column {
        Button(
            onClick = {
                scope.launch {
                    listState.animateScrollToItem(50)
                }
            }
        ) {
            Text("Превърти до 50")
        }

        LazyColumn(state = listState) {
            items((1..100).toList()) { item ->
                Text(
                    text = "Елемент $item",
                    modifier = Modifier.padding(8.dp)
                )
            }
        }
    }
}

Оптимизиране на производителността на LazyColumn

Ключовият фактор за производителността на LazyColumn е правилното използване на ключове. Всеки елемент трябва да има уникален стабилен ключ чрез параметъра key. Без ключове, Compose не може правилно да използва повторно елементите при промяна на данни, което води до рекомпозиция.

contentType информира LazyColumn кои елементи имат еднакъв тип оформление. Когато два елемента с еднакъв contentType попаднат в зоната на обработка, LazyColumn може да използва повторно тяхното оформление без рекомпозиция. Според Android Developers Blog, 2024, contentType подобрява производителността с 30–50% в списъци с различни типове елементи.

За LazyColumn също така е важно да се избягват нестабилни параметри във фабричните функции. Всеки път, когато параметър на елемент се промени, Compose рекомпозира този елемент. Използването на remember и derivedStateOf за стабилни стойности намалява броя на рекомпозициите.

Таблица на факторите за производителност

ФакторВлияниеПрепоръка
Ключове (key)КлючовоВинаги задавайте уникален стабилен key за items
contentTypeЗначителноПосочете типа на елемента за оптимизиране на повторното използване
Размер на елементитеСредноИзползвайте фиксирани размери, където е възможно
Вложени списъциКритичноИзбягвайте LazyColumn вътре в LazyColumn — използвайте LazyVerticalGrid

Sticky headers и секции в LazyColumn

stickyHeader е DSL функция на LazyColumn, която закрепва заглавната част на секцията в горната част на списъка при превъртане. Когато следващата секция достигне върха, нейната заглавна част замества текущата. Това поведение е познато на потребителите от списъци с контакти и календари.

stickyHeader приема ключ и фабрична функция, подобно на item. За разлика от обикновения item, stickyHeader остава видим при превъртане на съдържанието на своята секция. Когато секцията е напълно превъртяна, заглавната част на следващата секция избутва предишната.

Според Material Design Guidelines, 2025, sticky header подобрява навигацията в дълги списъци и намалява когнитивното натоварване на потребителя. За внедряване на sticky header е достатъчно да обвиете заглавната част на секцията в stickyHeader на правилната позиция спрямо елементите 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))
            }
        }
    }
}

Често задавани въпроси

По какво се различава LazyColumn от Column в Compose?

Column рендерира всички елементи наведнъж и е подходящ за списъци до 20–30 елемента. LazyColumn създава само видимите елементи и ги използва повторно при превъртане, което позволява работа с хиляди елементи без загуба на производителност.

Как да добавя разделители между елементите на LazyColumn?

Използвайте Arrangement.spacedBy в параметъра verticalArrangement или функциите items с разделител чрез индекс. За сложни разделители добавете отделен item с Divider() между елементите на списъка.

Как да актуализирам LazyColumn при промяна на данни?

LazyColumn автоматично се рекомпозира при промяна на колекцията от данни, ако се използват стабилни ключове. Промените в данните, открити чрез mutableStateListOf или StateFlow, водят до прерисуване само на променените елементи.

Може ли LazyColumn да бъде вложен в LazyColumn?

Директното влагане на LazyColumn в LazyColumn не се препоръчва — и двете имат независимо превъртане, което създава конфликт на жестове. Вместо това използвайте обикновен Column с LazyColumn вътре в превъртаща се секция или LazyVerticalGrid за мрежи.

Как да определя, че LazyColumn е превъртян до края?

Използвайте LazyListState.layoutInfo.visibleItemsInfo и сравнете индекса на последния видим елемент с общия брой елементи. За безкрайно превъртане проследявайте кога последният видим елемент се приближава до края на списъка.

Обобщение

  • LazyColumn е вертикален списък с мързеливо зареждане, който създава и използва повторно елементи само в зоната на видимост за ефективна работа с големи данни.
  • items и item са DSL функции за добавяне на колекции от данни и единични компоненти в LazyColumn с поддръжка на ключове и contentType.
  • LazyListState управлява позицията на превъртане, осигурявайки програмна навигация чрез animateScrollToItem и scrollToItem в корутини.
  • contentType и key са основните инструменти за оптимизиране на производителността, намаляващи рекомпозицията и подобряващи повторното използване на елементи.
  • stickyHeader закрепва заглавните части на секциите в горната част на списъка, подобрявайки навигацията в дълги списъци с групиране на данни.
  • Arrangement.spacedBy и contentPadding управляват разстоянията между елементите и ръбовете на LazyColumn за съответствие с Material Design.
  • За хоризонтални списъци с мързеливо зареждане използвайте LazyRow, а за мрежи — LazyVerticalGrid, следвайки същия принцип на мързеливо зареждане.

Ще разработим мобилно приложение под ключ

IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.

Обсъдете проекта

Прочетете също