iT邦幫忙

2025 iThome 鐵人賽

DAY 9
0
Mobile Development

現代Android jetpack compose開發入門系列 第 9

Day 9:更靈活的container,簡化排版難度

  • 分享至 

  • xImage
  •  

上一篇的內容是進階的輸入設定,這一篇主要講的是自動container,也是最常用的功能之一

舊的container

val objs: List<Obj> = listOf(...)
Column(modifier = Modifier.verticalScroll()) {
	for (obj in objs) {  
	    ObjDisplay(obj)  
	}
}

如果你要很多的物件一起打包並簡單的使用,就大概會是這樣
但是這樣真的是有一點不方便,而且效能較差

Lazy Conatiner

對比原本的column和row,它只會加載螢幕上的物件,如果你有1000筆數據,那差距就很明顯了
Lazy系列有幾個container

  • LazyColumn
  • LazyRow
  • LazyGrid
    其中LazyGrid的使用比較複雜

LazyColumn(Row)

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

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有很多屬性,我這裡列幾個比較重要的,其他的是比較進階的功能

columns

這個參數是GridCells類,可以用Adaptive/Fixed/FixedSize

  • Adaptive:規定格子的最小大小
  • Fixed:規定column數量
  • FixedSize:規定格子的大小(絕對大小)

Arrangement

分垂直和水平,可以讓格子之間有間隔

contentPadding

給裡面的格子套上一層padding,不同於Arrangement,他作用在item上而不是排版上

Item Span

可以調整格子的跨度,在例子中跨度就是2,代表佔據2 column

其他屬性

可以監控滑動狀態和指定顯示位置等功能

Container的使用建議

Container 適合場景 特點
Column/Row 少量項目 一次渲染所有內容
LazyColumn/LazyRow 清單、訊息 按需載入,可捲動
LazyGrid 圖片牆、商品卡片 GridCells 控制欄位數,自帶捲動

上一篇
Day 8:直覺化的UI體驗,使用Ime與Keyboard功能
下一篇
Day 10:多語言設定與圖片資源
系列文
現代Android jetpack compose開發入門10
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言