LazyColumn ay isang composable function sa Jetpack Compose para sa paggawa ng vertical na mga listahan na may lazy loading ng mga elemento. Hindi tulad ng Column, ang LazyColumn ay lumilikha at bumubuo lamang ng mga elementong nakikita sa screen, muling ginagamit ang mga ito habang nag-i-scroll. Ayon sa Google Android Documentation, 2025, ang LazyColumn ay ang pangunahing kasangkapan para sa pagpapakita ng malalaking set ng data sa mobile applications dahil sa mahusay na pamamahala ng memorya.
Mga Pangunahing Punto
LazyColumn ay isang composable function na nagpapatupad ng vertical na nai-scroll na listahan na may lazy loading. Hindi tulad ng Column na nagre-render ng lahat ng child element nang sabay-sabay, ang LazyColumn ay lumilikha lamang ng mga elementong pumapasok sa viewing area.
Ang mekanismo ng lazy loading sa LazyColumn ay batay sa muling paggamit ng mga elemento: kapag ang isang elemento ay nakatago habang nag-i-scroll, ang komposisyon at layout nito ay maaaring magamit muli para sa isang bagong ipinapakitang elemento. Ito ay nakakatipid ng memorya at oras ng processor, lalo na sa mahabang listahan.
Ayon sa Android Developers Blog, 2024, ang LazyColumn ay maaaring mahusay na magproseso ng mga listahan ng sampu-sampung libong elemento nang walang makabuluhang pagbaba ng pagganap. Ang bawat elemento sa LazyColumn ay may susi (key) na tumutulong sa Compose na kilalanin at mapanatili ang estado ng elemento kapag nagbago ang listahan.
LazyColumn ay tumatanggap ng mga parameter na modifier, state, contentPadding, reverseLayout, verticalArrangement at horizontalAlignment. Ang nilalaman ay tinukoy sa lambda block sa pamamagitan ng DSL function na items at item.
@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 = "Item $item")
}
}
}
Ang DSL block ng LazyColumn ay nagbibigay ng mga function na items at item para sa pagdaragdag ng nilalaman. Ang items ay tumatanggap ng koleksyon ng data, susi at factory function para sa paggawa ng mga elemento. Ang item ay nagdaragdag ng isang static na elemento sa listahan.
itemsIndexed ay isang variant ng items na nagpapasa ng index ng elemento bilang karagdagan sa data. Ito ay kapaki-pakinabang kapag kailangan ang posisyon ng elemento nang walang hiwalay na pagkalkula. items(size) ay tumatanggap lamang ng bilang ng mga elemento at factory nang walang koneksyon sa koleksyon.
Ang parameter na key sa items ay natatanging nagpapakilala sa bawat elemento. Ayon sa Material Design Guidelines, 2025, ang mga susi ay nagpapabuti sa pagganap kapag nag-a-update at nag-a-animate ng mga elemento, dahil masusubaybayan ng Compose ang paglipat o pagbabago ng isang partikular na elemento sa pamamagitan ng susi.
Ang function na items na may contentType ay nagbibigay-daan sa LazyColumn na i-optimize ang muling paggamit ng mga elemento ng iba't ibang uri. Sa halimbawa sa ibaba, sa isang listahan ay ginagamit ang mga header ng seksyon at ordinaryong row.
@Composable
fun MixedItemsList() {
LazyColumn {
item {
Text(
text = "Header",
style = MaterialTheme.typography.headlineMedium
)
}
items(
items = (1..20).toList(),
key = { it },
contentType = { "item" }
) { item ->
Text(text = "Row $item")
}
}
}
LazyListState ay isang state object ng LazyColumn na sumusubaybay sa kasalukuyang posisyon ng pag-scroll, unang nakikitang elemento at offset. Maaari itong gawin sa pamamagitan ng rememberLazyListState() at ipasa sa parameter na state ng LazyColumn.
LazyListState ay nagbibigay ng mga pamamaraan na animateScrollToItem at scrollToItem para sa programmatic na pag-scroll sa isang partikular na elemento. Ang animateScrollToItem ay lumilikha ng makinis na scroll animation, habang ang scrollToItem ay agad na nag-i-scroll. Ang parehong pamamaraan ay nangangailangan ng pagtawag sa loob ng isang coroutine sa CompositionContext.
Ayon sa Android Developers, 2024, ang LazyListState ay naglalaman din ng layoutInfo, na nagbibigay ng impormasyon tungkol sa mga nakikitang elemento — kanilang mga index, offset at sukat. Ito ay kapaki-pakinabang para sa pagpapatupad ng analytics, pagsubaybay sa mga view o walang katapusang pag-scroll.
Sa halimbawang ito, ang LazyColumn ay pinamamahalaan sa pamamagitan ng LazyListState. Ang button ay nag-i-scroll sa listahan patungo sa elemento na may index 50 na may makinis na animation.
@Composable
fun ScrollableList() {
val listState = rememberLazyListState()
val scope = rememberCoroutineScope()
Column {
Button(
onClick = {
scope.launch {
listState.animateScrollToItem(50)
}
}
) {
Text("Mag-scroll sa 50")
}
LazyColumn(state = listState) {
items((1..100).toList()) { item ->
Text(
text = "Item $item",
modifier = Modifier.padding(8.dp)
)
}
}
}
}
Ang pangunahing kadahilanan sa pagganap ng LazyColumn ay ang tamang paggamit ng mga susi. Ang bawat elemento ay dapat magkaroon ng natatanging matatag na susi sa pamamagitan ng parameter na key. Kung walang mga susi, hindi maaaring gamitin muli ng Compose ang mga elemento nang tama kapag nagbago ang data, na humahantong sa recomposition.
contentType ay nagpapaalam sa LazyColumn kung aling mga elemento ang may parehong uri ng layout. Kapag ang dalawang elemento na may parehong contentType ay pumasok sa processing area, maaaring gamitin muli ng LazyColumn ang kanilang layout nang walang recomposition. Ayon sa Android Developers Blog, 2024, ang contentType ay nagpapabuti ng pagganap ng 30–50% sa mga listahan na may iba't ibang uri ng elemento.
Para sa LazyColumn mahalaga rin na iwasan ang hindi matatag na mga parameter sa factory function. Sa bawat oras na magbago ang parameter ng isang elemento, ire-recompose ng Compose ang elementong iyon. Ang paggamit ng remember at derivedStateOf para sa matatag na halaga ay nagbabawas sa bilang ng mga recomposition.
| Kadahilanan | Epekto | Rekomendasyon |
|---|---|---|
| Mga Susi (key) | Mahalaga | Palaging magtakda ng natatanging matatag na key para sa items |
| contentType | Malaki | Tukuyin ang uri ng elemento para sa pag-optimize ng muling paggamit |
| Sukat ng elemento | Katamtaman | Gumamit ng nakapirming sukat kung saan posible |
| Nakapugad na listahan | Kritikal | Iwasan ang LazyColumn sa loob ng LazyColumn — gumamit ng LazyVerticalGrid |
stickyHeader ay isang DSL function ng LazyColumn na nag-aayos ng header ng seksyon sa itaas na bahagi ng listahan habang nag-i-scroll. Kapag ang susunod na seksyon ay umabot sa itaas, ang header nito ay pumapalit sa kasalukuyan. Ang pag-uugaling ito ay pamilyar sa mga gumagamit mula sa mga listahan ng contact at kalendaryo.
stickyHeader ay tumatanggap ng susi at factory function, katulad ng item. Hindi tulad ng ordinaryong item, ang stickyHeader ay nananatiling nakikita habang nag-i-scroll ang nilalaman ng seksyon nito. Kapag ang seksyon ay ganap na na-scroll, ang header ng susunod na seksyon ay itinutulak ang nauna.
Ayon sa Material Design Guidelines, 2025, ang sticky header ay nagpapabuti sa nabigasyon sa mahabang listahan at nagbabawas ng cognitive load ng gumagamit. Para sa pagpapatupad ng sticky header, sapat na upang balutin ang header ng seksyon sa stickyHeader sa tamang posisyon kaugnay ng mga elemento ng items.
@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))
}
}
}
}
Mga Madalas Itanong
Column ay nagre-render ng lahat ng elemento nang sabay-sabay at angkop para sa mga listahan hanggang 20–30 elemento. Ang LazyColumn ay lumilikha lamang ng mga nakikitang elemento at muling ginagamit ang mga ito habang nag-i-scroll, na nagpapahintulot sa pagtatrabaho sa libu-libong elemento nang walang pagkawala ng pagganap.
Gumamit ng Arrangement.spacedBy sa parameter na verticalArrangement o mga function na items na may separator sa pamamagitan ng index. Para sa kumplikadong separator, magdagdag ng hiwalay na item na may Divider() sa pagitan ng mga elemento ng listahan.
LazyColumn ay awtomatikong nagre-recompose kapag nagbago ang koleksyon ng data, kung ginagamit ang matatag na mga susi. Ang mga pagbabago sa data na natukoy sa pamamagitan ng mutableStateListOf o StateFlow ay humahantong sa muling pagguhit lamang ng mga nabagong elemento.
Ang direktang paglalagay ng LazyColumn sa loob ng LazyColumn ay hindi inirerekomenda — pareho silang may independiyenteng pag-scroll, na lumilikha ng conflict ng gesture. Sa halip, gumamit ng ordinaryong Column na may LazyColumn sa loob ng isang nai-scroll na seksyon o LazyVerticalGrid para sa mga grid.
Gumamit ng LazyListState.layoutInfo.visibleItemsInfo at ihambing ang index ng huling nakikitang elemento sa kabuuang bilang ng mga elemento. Para sa walang katapusang pag-scroll, subaybayan kung kailan ang huling nakikitang elemento ay lumalapit sa dulo ng listahan.
Buod
Gagawa kami ng mobile application na turnkey
Gumagawa ang IT Sectr ng mga iOS at Android application para sa mga startup at negosyo mula noong 2017. Magpapayo kami sa iyo at magmumungkahi ng pinakamahusay na solusyon.
Basahin din