← Назад к вопросам

Как создавать списки в Jetpack Compose? Чем LazyColumn отличается от Column?

1.0 Junior🔥 231 комментариев
#UI и вёрстка#Производительность и оптимизация

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Создание списков в Jetpack Compose

В Jetpack Compose для создания списков используются два основных компонента: Column для простых статических списков и LazyColumn для оптимизированных списков с большим количеством элементов. Вот основные подходы:

Простые списки с Column

Для статических списков с небольшим количеством элементов можно использовать Column:

@Composable
fun SimpleList() {
    Column {
        repeat(10) { index ->
            Text(
                text = "Элемент $index",
                modifier = Modifier
                    .fillMaxWidth()
                    .padding(16.dp)
            )
        }
    }
}

Оптимизированные списки с LazyColumn

Для эффективной работы с большими наборами данных используется LazyColumn:

@Composable
fun OptimizedList(items: List<String>) {
    LazyColumn(
        modifier = Modifier.fillMaxSize(),
        contentPadding = PaddingValues(8.dp),
        verticalArrangement = Arrangement.spacedBy(8.dp)
    ) {
        items(items) { item ->
            Card(
                modifier = Modifier.fillMaxWidth(),
                elevation = CardDefaults.cardElevation(defaultElevation = 4.dp)
            ) {
                Text(
                    text = item,
                    modifier = Modifier.padding(16.dp),
                    style = MaterialTheme.typography.bodyLarge
                )
            }
        }
    }
}

Расширенные возможности LazyColumn

LazyColumn поддерживает различные типы элементов и сложные сценарии:

@Composable
fun AdvancedList(data: List<DataItem>) {
    LazyColumn {
        // Заголовок списка
        item {
            Text(
                text = "Список элементов",
                style = MaterialTheme.typography.headlineMedium,
                modifier = Modifier.padding(16.dp)
            )
        }
        
        // Группировка элементов
        itemsIndexed(data) { index, item ->
            ListItem(item = item)
            
            // Разделитель между элементами
            if (index < data.lastIndex) {
                Divider(
                    modifier = Modifier.padding(horizontal = 16.dp),
                    thickness = 1.dp
                )
            }
        }
        
        // Подвал списка
        item {
            Text(
                text = "Всего элементов: ${data.size}",
                modifier = Modifier
                    .fillMaxWidth()
                    .padding(16.dp),
                textAlign = TextAlign.Center
            )
        }
    }
}

Отличия LazyColumn от Column

1. Механизм работы с элементами

  • Column: Рендерит ВСЕ дочерние элементы одновременно, независимо от их видимости на экране
  • LazyColumn: Реализует ленивую загрузку — создаёт только те элементы, которые в данный момент видны на экране, + небольшой буфер

2. Производительность

  • Column: Неэффективен для больших списков (сотни/тысячи элементов), приводит к высокому потреблению памяти и падению FPS
  • LazyColumn: Оптимизирован для работы с большими наборами данных, обеспечивает плавную прокрутку и минимальное использование памяти

3. API и возможности

  • Column: Простой API для размещения элементов в вертикальном порядке
  • LazyColumn: Богатый API с поддержкой:
    • items() для коллекций
    • itemsIndexed() с доступом к индексу
    • item() для одиночных элементов
    • Контроль состояния прокрутки
    • Анимации появления/скрытия
    • Кастомные расположения элементов

4. Состояние прокрутки

// LazyColumn предоставляет состояние прокрутки
val listState = rememberLazyListState()

LazyColumn(state = listState) {
    // элементы
}

// Можно контролировать и реагировать на прокрутку
LaunchedEffect(listState) {
    snapshotFlow { listState.firstVisibleItemIndex }
        .collect { index ->
            // Реакция на изменение видимого элемента
        }
}

5. Повторное использование элементов

  • Column: Каждый элемент существует постоянно в памяти
  • LazyColumn: Реализует рециклинг — повторно использует представления элементов при прокрутке, что значительно улучшает производительность

6. Использование памяти

  • Column: Линейный рост потребления памяти с увеличением количества элементов
  • LazyColumn: Постоянное (ограниченное) потребление памяти независимо от общего размера списка

Практические рекомендации

Когда использовать Column:

  • Статические интерфейсы с небольшим фиксированным числом элементов (меню, формы)
  • Когда все элементы должны быть всегда доступны и измерены
  • Для простых компоновок без прокрутки

Когда использовать LazyColumn:

  • Любые динамические списки данных (списки контактов, сообщений, товаров)
  • Когда количество элементов может быть большим (более 20-30)
  • При необходимости плавной прокрутки
  • Для списков с разными типами элементов

Важные особенности LazyColumn:

@Composable
fun BestPracticesList(items: List<Item>) {
    LazyColumn(
        // Указывайте ключи для стабильной идентификации элементов
        key = { items[it].id },
        
        // Настройте размеры элементов для оптимизации
        modifier = Modifier
            .fillMaxSize()
            .heightIn(min = 200.dp, max = 400.dp),
        
        // Используйте правильные модификаторы для дочерних элементов
        content = {
            items(items, key = { it.id }) { item ->
                ItemView(
                    item = item,
                    modifier = Modifier
                        .fillMaxWidth()
                        .animateItemPlacement() // Анимация при изменении порядка
                )
            }
        }
    )
}

Ключевое правило: Для любых скроллируемых списков с динамическими данными всегда используйте LazyColumn (или LazyRow для горизонтальных списков). Column подходит только для статических компоновок, где количество элементов известно на этапе компиляции и их немного.

Как создавать списки в Jetpack Compose? Чем LazyColumn отличается от Column? | PrepBro