Middle
Jak utworzyć RecyclerView w Jetpack Compose?
sobes.tech AI
Odpowiedź od AI
W Jetpack Compose nie ma RecyclerView w tradycyjnym sensie. Do wyświetlania list używa się LazyColumn (dla list pionowych) i LazyRow (dla list poziomych). Zapewniają one podobną wydajność dzięki ponownemu użyciu elementów.
Przykład użycia 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)
}
}
}
Analiza:
LazyColumn: Funkcja composable, która wyświetla elementy na liście pionowej, tworząc je w razie potrzeby.items(itemsList) { item -> ... }: Rozszerzenie dlaLazyListScope, które pozwala na iterację po liście danych (itemsList) i wywołanie przekazanego lambdaComposabledla każdego elementu (item). W tym bloku określa się, jak wygląda każdy element listy.Text(text = item): Prosta funkcja composable wyświetlająca tekst aktualnego elementu listy.
Kluczowe cechy LazyColumn/LazyRow:
- Wydajność: Elementy są tworzone i składane tylko wtedy, gdy stają się widoczne na ekranie lub są blisko krawędzi. To zmniejsza zużycie pamięci i poprawia wydajność dla dużych list.
- Prostota: API jest uproszczone w porównaniu do RecyclerView, nie wymaga tworzenia adapterów, ViewHolderów ani zarządzania cyklem życia tych komponentów.
- Kompletnie zintegrowane: Bezproblemowo współpracuje z innymi funkcjami Compose.
Możesz użyć itemsIndexed, aby uzyskać dostęp do indeksu każdego elementu:
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 = "Element na indeksie $index: $item")
}
}
}
Dla bardziej złożonych zachowań (np. różne typy widoków), można użyć przeciążenia items lub 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 -> {
// Tutaj można wyświetlić obraz, np. za pomocą funkcji Image
Text(text = "Obraz: ${item.url}") // Zastępczy tekst
}
}
}
}
}