Назад к вопросам
Middle
88
questionbank

Как создать RecyclerView в Jetpack Compose?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

В Jetpack Compose нет RecyclerView в традиционном понимании. Для отображения списков используется LazyColumn (для вертикальных списков) и LazyRow (для горизонтальных списков). Они предоставляют аналогичную эффективность за счет переиспользования элементов.

Пример использования LazyColumn:

import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.material.Text
import androidx.compose.runtime.Composable

@Composable
fun SimpleList(itemsList: List<String>) {
    LazyColumn {
        items(itemsList) { item ->
            Text(text = item)
        }
    }
}

Разбор:

  • LazyColumn: Композируемая функция, которая отображает элементы в вертикальном списке, создавая их по мере необходимости.
  • items(itemsList) { item -> ... }: Расширение для LazyListScope, которое позволяет итерироваться по списку данных (itemsList) и для каждого элемента (item) вызывать предоставленный Composable лямбда-блок. В этом блоке определяется, как будет выглядеть каждый элемент списка.
  • Text(text = item): Простая дочерняя композируемая функция, отображающая текст текущего элемента списка.

Ключевые особенности LazyColumn/LazyRow:

  • Эффективность: Элементы создаются и компонуются только тогда, когда они становятся видимыми на экране или находятся близко к краю. Это снижает потребление памяти и улучшает производительность для больших списков.
  • Простота: Упрощенный API по сравнению с RecyclerView, не требующий создания адаптера, ViewHolder и управления жизненным циклом этих компонентов.
  • Composable first: Полностью интегрируется с другими Compose-функциями.

Можно использовать itemsIndexed для доступа к индексу каждого элемента:

import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.itemsIndexed
import androidx.compose.material.Text
import androidx.compose.runtime.Composable

@Composable
fun IndexedList(itemsList: List<String>) {
    LazyColumn {
        itemsIndexed(itemsList) { index, item ->
            Text(text = "Item at index $index: $item")
        }
    }
}

Для более сложного поведения (например, разные типы представлений), можно использовать перегрузку items или item:

import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.material.Text
import androidx.compose.runtime.Composable

sealed class ListItem {
    data class TextItem(val content: String) : ListItem()
    data class ImageItem(val url: String) : ListItem()
}

@Composable
fun MixedList(itemsList: List<ListItem>) {
    LazyColumn {
        items(itemsList) { item ->
            when (item) {
                is ListItem.TextItem -> Text(text = item.content)
                is ListItem.ImageItem -> {
                    // Здесь можно отобразить изображение, например с помощью функции Image
                    Text(text = "Image: ${item.url}") // Заглушка
                }
            }
        }
    }
}