LazyColumn Jetpack Compose-da vertikal ro'yxatlarni tənbəl yüklash bilan yaratish uchun composable funksiyadir. Column-dan farqli o'laroq, LazyColumn faqat ekranda ko'rinadigan elementlarni yaratadi va kompozitsiya qiladi, ularni aylantirishda qayta ishlatadi. Google Android Documentation, 2025-ga ko'ra, LazyColumn xotirani samarali boshqarish tufayli mobil ilovalarda katta ma'lumotlar to'plamlarini ko'rsatish uchun asosiy vositadir.
Asosiy nuqtalar
LazyColumn tənbəl yüklash bilan vertikal aylantiriladigan ro'yxatni amalga oshiruvchi composable funksiyadir. Barcha bola elementlarni birdaniga render qiluvchi Column-dan farqli o'laroq, LazyColumn faqat ko'rinish maydoniga kiradigan elementlarni yaratadi.
LazyColumn-da tənbəl yüklash mexanizmi elementlarning qayta ishlatilishiga asoslangan: element aylantirish paytida yashiringanda, uning kompozitsiyasi va layouti yangi ko'rsatiladigan element uchun qayta ishlatilishi mumkin. Bu, ayniqsa, uzun ro'yxatlarda xotira va protsessor vaqtini tejaydi.
Android Developers Blog, 2024-ga ko'ra, LazyColumn o'n minglab elementlardan iborat ro'yxatlarni unumdorlikni sezilarli darajada pasaytirmasdan samarali qayta ishlay oladi. LazyColumn-dagi har bir element kalitga (key) ega bo'lib, u Compose-ga ro'yxat o'zgarishlarida elementni aniqlash va uning holatini saqlashga yordam beradi.
LazyColumn modifier, state, contentPadding, reverseLayout, verticalArrangement va horizontalAlignment parametrlarini qabul qiladi. Tarkib lambda blokida DSL funksiyalari items va item orqali belgilanadi.
@Composable
fun SimpleLazyColumn() {
val itemsList = (1..100).toList()
LazyColumn(
modifier = Modifier.fillMaxSize(),
verticalArrangement = Arrangement.spacedBy(8.dp),
contentPadding = PaddingValues(16.dp)
) {
items(itemsList) { item ->
Text(text = "Element $item")
}
}
}
LazyColumn-ning DSL bloki tarkib qo'shish uchun items va item funksiyalarini taqdim etadi. items ma'lumotlar to'plamini, kalitni va elementlarni yaratish uchun fabrika funksiyasini qabul qiladi. item ro'yxatga bitta statik element qo'shadi.
itemsIndexed ma'lumotlarga qo'shimcha ravishda element indeksini uzatuvchi items variantidir. Bu elementning o'rnini alohida hisoblashsiz bilish kerak bo'lganda foydalidir. items(size) faqat elementlar sonini va to'plamga bog'liq bo'lmagan fabrikani qabul qiladi.
items-dagi key parametri har bir elementni noyob tarzda identifikatsiya qiladi. Material Design Guidelines, 2025-ga ko'ra, kalitlar elementlarni yangilash va animatsiya qilishda unumdorlikni yaxshilaydi, chunki Compose kalit orqali aniq elementning siljishi yoki o'zgarishini kuzatishi mumkin.
contentType bilan items funksiyasi LazyColumn-ga turli xil elementlarning qayta ishlatilishini optimallashtirish imkonini beradi. Quyidagi misolda bitta ro'yxatda bo'lim sarlavhalari va oddiy qatorlar ishlatilgan.
@Composable
fun MixedItemsList() {
LazyColumn {
item {
Text(
text = "Sarlavha",
style = MaterialTheme.typography.headlineMedium
)
}
items(
items = (1..20).toList(),
key = { it },
contentType = { "item" }
) { item ->
Text(text = "Qator $item")
}
}
}
LazyListState joriy aylantirish pozitsiyasini, birinchi ko'rinadigan elementni va siljishni kuzatib boruvchi LazyColumn holat obyektidir. U rememberLazyListState() orqali yaratilishi va LazyColumn-ning state parametriga uzatilishi mumkin.
LazyListState ma'lum bir elementga dasturiy aylantirish uchun animateScrollToItem va scrollToItem metodlarini taqdim etadi. animateScrollToItem silliq aylantirish animatsiyasini yaratadi, scrollToItem esa darhol aylantiradi. Ikkala metod ham CompositionContext ichidagi korutin ichida chaqirilishini talab qiladi.
Android Developers, 2024-ga ko'ra, LazyListState shuningdek ko'rinadigan elementlar haqida ma'lumot beruvchi layoutInfo-ni o'z ichiga oladi — ularning indekslari, siljishlari va o'lchamlari. Bu analitika, ko'rishlarni kuzatish yoki cheksiz aylantirishni amalga oshirish uchun foydalidir.
Ushbu misolda LazyColumn LazyListState orqali boshqariladi. Tugma ro'yxatni silliq animatsiya bilan indeksi 50 bo'lgan elementga aylantiradi.
@Composable
fun ScrollableList() {
val listState = rememberLazyListState()
val scope = rememberCoroutineScope()
Column {
Button(
onClick = {
scope.launch {
listState.animateScrollToItem(50)
}
}
) {
Text("50-ga aylantir")
}
LazyColumn(state = listState) {
items((1..100).toList()) { item ->
Text(
text = "Element $item",
modifier = Modifier.padding(8.dp)
)
}
}
}
}
LazyColumn unumdorligining asosiy omili kalitlardan to'g'ri foydalanishdir. Har bir element key parametri orqali noyob barqaror kalitga ega bo'lishi kerak. Kalitlarsiz Compose ma'lumot o'zgarishlarida elementlarni to'g'ri qayta ishlata olmaydi, bu esa qayta kompozitsiyaga olib keladi.
contentType LazyColumn-ga qaysi elementlar bir xil layout turiga ega ekanligini bildiradi. Bir xil contentType-ga ega ikkita element qayta ishlash maydoniga tushganda, LazyColumn qayta kompozitsiyasiz ularning layoutini qayta ishlatishi mumkin. Android Developers Blog, 2024-ga ko'ra, contentType turli xil element turlari bo'lgan ro'yxatlarda unumdorlikni 30–50% yaxshilaydi.
LazyColumn uchun fabrika funksiyalarida beqaror parametrlardan qochish ham muhimdir. Element parametri har safar o'zgarganda, Compose ushbu elementni qayta kompozitsiya qiladi. Barqaror qiymatlar uchun remember va derivedStateOf dan foydalanish qayta kompozitsiyalar sonini kamaytiradi.
| Omil | Ta'sir | Tavsiya |
|---|---|---|
| Kalitlar (key) | Asosiy | Har doim items uchun noyob barqaror key o'rnating |
| contentType | Muhim | Qayta ishlatishni optimallashtirish uchun element turini ko'rsating |
| Element o'lchami | O'rtacha | Iloji bo'lganda sobit o'lchamlardan foydalaning |
| Ichma-ich ro'yxatlar | Tanqidiy | LazyColumn ichida LazyColumn-dan qoching — LazyVerticalGrid dan foydalaning |
stickyHeader aylantirish paytida bo'lim sarlavhasini ro'yxatning yuqori qismida mahkamlaydigan LazyColumn DSL funksiyasidir. Keyingi bo'lim yuqoriga yetganda, uning sarlavhasi joriy sarlavhani almashtiradi. Bu xatti-harakat foydalanuvchilarga kontakt ro'yxatlari va kalendarlardan tanishdir.
stickyHeader item-ga o'xshab kalit va fabrika funksiyasini qabul qiladi. Oddiy item-dan farqli o'laroq, stickyHeader o'z bo'limining tarkibi aylantirilganda ko'rinadigan bo'lib qoladi. Bo'lim to'liq aylantirilganda, keyingi bo'limning sarlavhasi oldingisini siqib chiqaradi.
Material Design Guidelines, 2025-ga ko'ra, sticky header uzun ro'yxatlarda navigatsiyani yaxshilaydi va foydalanuvchining kognitiv yukini kamaytiradi. Sticky header-ni amalga oshirish uchun bo'lim sarlavhasini items elementlariga nisbatan to'g'ri pozitsiyada stickyHeader bilan o'rash kifoya.
@Composable
fun SectionedList(sections: Map<String, List<String>>) {
LazyColumn {
sections.forEach { (header, items) ->
stickyHeader {
Text(
text = header,
modifier = Modifier.background(Color.White)
.padding(16.dp)
)
}
items(items) { item ->
Text(text = item, modifier = Modifier.padding(8.dp))
}
}
}
}
Tez-tez so'raladigan savollar
Column barcha elementlarni birdaniga render qiladi va 20–30 elementgacha bo'lgan ro'yxatlar uchun mos keladi. LazyColumn faqat ko'rinadigan elementlarni yaratadi va aylantirishda ularni qayta ishlatadi, bu esa unumdorlikni yo'qotmasdan minglab elementlar bilan ishlash imkonini beradi.
verticalArrangement parametrida Arrangement.spacedBy dan foydalaning yoki indeks orqali ajratgich bilan items funksiyalaridan foydalaning. Murakkab ajratgichlar uchun ro'yxat elementlari orasiga Divider() bilan alohida item qo'shing.
LazyColumn barqaror kalitlardan foydalanilganda ma'lumotlar to'plami o'zgarganda avtomatik ravishda qayta kompozitsiya qilinadi. mutableStateListOf yoki StateFlow orqali aniqlangan ma'lumot o'zgarishlari faqat o'zgargan elementlarning qayta chizilishiga olib keladi.
LazyColumn-ni LazyColumn ichiga to'g'ridan-to'g'ri joylashtirish tavsiya etilmaydi — ikkalasi ham mustaqil aylantirishga ega, bu esa jest ziddiyatini keltirib chiqaradi. Buning o'rniga aylantiriladigan bo'lim ichida LazyColumn bilan oddiy Column yoki tarmoqlar uchun LazyVerticalGrid dan foydalaning.
LazyListState.layoutInfo.visibleItemsInfo dan foydalaning va oxirgi ko'rinadigan element indeksini elementlarning umumiy soni bilan solishtiring. Cheksiz aylantirish uchun oxirgi ko'rinadigan element ro'yxat oxiriga yaqinlashganda kuzatib boring.
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.