上一篇的內容是進階的輸入設定,這一篇主要講的是自動container,也是最常用的功能之一
val objs: List<Obj> = listOf(...)
Column(modifier = Modifier.verticalScroll()) {
for (obj in objs) {
ObjDisplay(obj)
}
}
如果你要很多的物件一起打包並簡單的使用,就大概會是這樣
但是這樣真的是有一點不方便,而且效能較差
對比原本的column和row,它只會加載螢幕上的物件,如果你有1000筆數據,那差距就很明顯了
Lazy系列有幾個container
val objs = listOf(1,2,3)
LazyColumn {
items(objs) {
Text("$it")
}
}
LazyRow {
items(3) {
Text("$it")
}
}
使用方式與Column和Row幾乎一致,其中items就是承擔for迴圈的職責,裡面可以放Int, Array, List,如果想要單一物件也可以使用item{}
注意:Lazy排版可以自己捲動,但如果沒有限制大小,會將同層次的物件擠掉
LazyGrid分兩種,垂直的LazyVerticalGrid和水平的LazyHorizontalGrid
這裡以vertical作範例
val objs = listOf(1,2,3)
LazyVerticalGrid(
columns = GridCells.Adaptive(20.dp),
verticalArrangement = Arrangement.spacedBy(3.dp),
contentPadding = PaddingValues(3.dp, 5.dp)
) {
items(objs) {
Text("$it")
}
item(span = { GridItemSpan(2) }) {
Text("Footer")
}
}
LazyGrid有很多屬性,我這裡列幾個比較重要的,其他的是比較進階的功能
這個參數是GridCells類,可以用Adaptive/Fixed/FixedSize
分垂直和水平,可以讓格子之間有間隔
給裡面的格子套上一層padding,不同於Arrangement,他作用在item上而不是排版上
可以調整格子的跨度,在例子中跨度就是2,代表佔據2 column
可以監控滑動狀態和指定顯示位置等功能
Container | 適合場景 | 特點 |
---|---|---|
Column/Row | 少量項目 | 一次渲染所有內容 |
LazyColumn/LazyRow | 清單、訊息 | 按需載入,可捲動 |
LazyGrid | 圖片牆、商品卡片 | GridCells 控制欄位數,自帶捲動 |