Sobes.tech
Middle

Чӣ гуна сохтани RecyclerView дар Jetpack Compose?

sobes.tech AI

Ҷавоб аз 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 і кіравання жыццёвым цыклам гэтых кампанентаў.
  • Кампазіруемы першы: Поўнасцю інтэгруецца з іншымі функцыямі 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}") // Заглушка
                }
            }
        }
    }
}