LazyRow — Jetpack Compose-da elementlarni dangasa yuklash bilan gorizontal roʻyxatlar yaratish uchun composable funksiyadir. Row-dan farqli oʻlaroq, LazyRow faqat koʻrinadigan elementlarni yaratadi va gorizontal aylantirishda ularni qayta ishlatadi. Google Android Documentation, 2025 ga koʻra, LazyRow LazyColumn-ning gorizontal analogidir va mobil ilovalarda karusellar, galereyalar va gorizontal menyular uchun samaralidir.
Asosiy fikrlar
LazyRow — elementlarni dangasa yuklash bilan gorizontal aylanadigan roʻyxatni amalga oshiruvchi composable funksiyadir. Barcha bolaviy elementlarni bir vaqtda koʻrsatadigan Row-dan farqli oʻlaroq, LazyRow faqat koʻrinish maydonida koʻrinadigan elementlarni yaratadi.
LazyRow LazyColumn bilan bir xil printsipda ishlaydi, lekin elementlarni gorizontal joylashtiradi. Chapga yoki oʻngga aylantirganda, koʻrinish maydonidan chiqqan elementlar yangilarini koʻrsatish uchun qayta ishlatiladi. Bu koʻp sonli rasmlari boʻlgan galereyalar yoki uzun kategoriya roʻyxatlari uchun juda muhim.
Android Developers Blog, 2024 ga koʻra, LazyRow LazyColumn bilan bir xil LazyList arxitekturasidan foydalanadi, jumladan LazyListState, Pool orqali qayta ishlatish mexanizmi va turli element turlarini qoʻllab-quvvatlash. Maksimal samaradorlik elementlarning qattiq balandligidan foydalanganda erishiladi.
LazyRow modifier, state, contentPadding, reverseLayout, horizontalArrangement va verticalAlignment parametrlarini qabul qiladi. Mazmun LazyColumn-ga oʻxshab DSL items va item funksiyalari orqali aniqlanadi.
@Composable
fun SimpleLazyRow() {
val items = (1..50).toList()
LazyRow(
modifier = Modifier.fillMaxWidth().height(100.dp),
horizontalArrangement = Arrangement.spacedBy(8.dp),
contentPadding = PaddingValues(start = 16.dp, end = 16.dp)
) {
items(items) { item ->
Box(
modifier = Modifier.size(80.dp).background(Color.Gray)
) {
Text(text = "$item", modifier = Modifier.align(Alignment.Center))
}
}
}
}
horizontalArrangement LazyRow ichidagi elementlarning gorizontal oʻq boʻylab taqsimlanishini boshqaradi. Row-da boʻlgani kabi bir xil Arrangement qiymatlari mavjud: Start, Center, End, SpaceBetween, SpaceEvenly, SpaceAround va maxsus boʻshliq bilan spacedBy.
contentPadding LazyRow konteynerining chetlarida boʻsh joy qoʻshadi. Modifier.padding-dan farqli oʻlaroq, contentPadding aylantirishda hisobga olinadi: birinchi element chap chetidan, oxirgi esa oʻng chetidan boʻshliqqa ega boʻladi. Material Design Guidelines, 2025 ga koʻra, contentPadding karusellar va galereyalar uchun majburiydir, birinchi va oxirgi elementlar ekran chetiga yopishmasligi uchun.
verticalAlignment LazyRow ichidagi elementlarni vertikal ravishda tekislaydi. Odatiy boʻlib Alignment.Top ishlatiladi. Turli balandlikdagi elementlarni markazlashtirish uchun Alignment.CenterVertically dan foydalaning, bu turli nisbatdagi rasmlari boʻlgan karusellar uchun foydali.
| Parametr | Tavsif | Odatiy qiymat |
|---|---|---|
| horizontalArrangement | Elementlarning gorizontal taqsimlanishi | Arrangement.Start |
| contentPadding | Konteyner chetlaridagi boʻshliq | PaddingValues(0.dp) |
| verticalAlignment | Vertikal tekislash | Alignment.Top |
| reverseLayout | Elementlarning teskari tartibi | false |
| userScrollEnabled | Foydalanuvchi tomonidan aylantirishga ruxsat | true |
LazyListState LazyRow uchun LazyColumn bilan bir xil ishlaydi: birinchi koʻrinadigan elementni, siljishni va umumiy aylantirish pozitsiyasini kuzatadi. Holat rememberLazyListState() orqali yaratiladi va state parametriga uzatiladi.
LazyRow ning dasturiy boshqaruvi bir xil usullar bilan amalga oshiriladi: silliq animatsiya uchun animateScrollToItem va darhol aylantirish uchun scrollToItem. Ikkalasi korutin ichida chaqiriladi. Bu "Chap/Oʻng" tugmalari boʻlgan karusellar yoki avtomatik aylantirish uchun foydali.
Android Developers, 2024 ga koʻra, LazyRow shuningdek SnapFlingBehavior — keskin aylantirishda elementlar orasida emas, balki eng yaqin elementda toʻxtaydigan xatti-harakatni qoʻllab-quvvatlaydi. Bu karusellar va galereyalar uchun tanish boʻlgan elementga "yopishish" effektini yaratadi.
@Composable
fun CarouselWithSnap() {
val listState = rememberLazyListState()
val scope = rememberCoroutineScope()
val items = listOf("A", "B", "C", "D", "E")
Column {
LazyRow(
state = listState,
flingBehavior = SnapFlingBehavior(listState),
horizontalArrangement = Arrangement.spacedBy(8.dp)
) {
items(items) { item ->
Card(modifier = Modifier.width(150.dp)) {
Text(text = item, modifier = Modifier.padding(16.dp))
}
}
}
Row(modifier = Modifier.fillMaxWidth()) {
Button(onClick = {
scope.launch {
listState.animateScrollToItem(0)
}
}) { Text("Boshlash uchun") }
}
}
}
Birinchi misol — oldindan koʻrish bilan rasm galereyasi uchun LazyRow. Har bir element rasm va sarlavha bilan Box dan iborat. LazyRow oʻnlab va yuzlab rasmlarni samarali boshqaradi, faqat koʻrinadiganlarini yuklaydi.
@Composable
fun ImageGallery(images: List<String>) {
LazyRow(
contentPadding = PaddingValues(start = 16.dp, end = 16.dp),
horizontalArrangement = Arrangement.spacedBy(12.dp)
) {
items(images, key = { it }) { url ->
AsyncImage(
model = url,
contentDescription = "Image",
modifier = Modifier.size(120.dp)
)
}
}
}
Ikkinchi misol — piktogrammalar bilan kategoriya roʻyxati uchun LazyRow. Kategoriyalar chip shaklida koʻrsatiladi va foydalanuvchi ularni gorizontal aylantirishi mumkin. spacedBy va contentPadding bilan LazyRow kategoriyalar orasida va chetlarda boʻsh joy yaratadi.
@Composable
fun CategoryChips(categories: List<String>) {
LazyRow(
contentPadding = PaddingValues(horizontal = 16.dp),
horizontalArrangement = Arrangement.spacedBy(8.dp)
) {
items(categories, key = { it }) { category ->
AssistChip(
onClick = {},
label = { Text(category) }
)
}
}
}
LazyRow va Row oʻrtasidagi tanlov elementlar soniga bogʻliq. Row ekranda doim koʻrinadigan 5–10 element uchun mos keladi. LazyRow elementlar koʻp boʻlganda yoki ularning soni dinamik boʻlganda majburiydir.
Row barcha elementlarni bir vaqtda koʻrsatadi, bu koʻp sonli elementlarda kechikishlarga olib keladi. LazyRow faqat koʻrinadiganlarni koʻrsatadi, bu uni aylanadigan roʻyxatlar uchun afzal qiladi. Android Developers Blog, 2024 ga koʻra, oʻtish chegarasi taxminan 10 element: agar elementlar koʻproq boʻlsa, LazyRow dan foydalaning.
LazyRow shuningdek animatsiyalar, SnapFlingBehavior va ajratgichlar orqali guruhlashni qoʻllab-quvvatlaydi, bu uni murakkab interfeyslar uchun moslashuvchan qiladi. Row soddaroq va LazyListState talab qilmaydi, lekin uzun roʻyxatlar uchun optimallashtirilmagan.
Koʻp beriladigan savollar
LazyRow gorizontal aylanadi va elementlarni chapdan oʻngga joylashtiradi, LazyColumn esa vertikal yuqoridan pastga. Ikkalasi ham bir xil dangasa yuklash printsiplaridan, LazyListState va DSL items funksiyalaridan foydalanadi.
SnapFlingBehavior(listState) ni LazyRow-ning flingBehavior parametriga oʻtkazing. SnapFlingBehaviour LazyRow-ning elementlar orasida emas, balki eng yaqin elementda toʻxtashiga sabab boʻladi, bu karusellar uchun yopishish effektini yaratadi.
LazyListState.layoutInfo orqali oxirgi koʻrinadigan elementni kuzating va oxirgi element roʻyxat oxiriga yaqinlashganda yangi maʼlumotlarni yuklang. Tsiklik aylantirish uchun elementlarni takrorlash bilan maxsus amalga oshirishdan foydalaning.
Ha, LazyRow ni LazyColumn ichiga joylashtirish mumkin. Bu vertikal roʻyxat ichida gorizontal karusellar bilan murakkab sahifalar yaratish uchun standart naqshdir. Har bir LazyRow toʻgʻri ishlash uchun qattiq balandlikka ega boʻlishi kerak.
LazyListState.layoutInfo.visibleItemsInfo dan foydalaning va oxirgi koʻrinadigan element indeksini umumiy sondan birni ayirib solishtiring. Bu qiymatlar mos kelganda, LazyRow roʻyxat oxirida joylashgan.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.