返回
不用LazyColumn,让Compose中的Column动起来!
Android
2023-12-19 11:25:17
Compose中的列表组件
Compose提供了两种主要组件来创建列表:LazyColumn和Column。LazyColumn旨在处理大型数据集,它只在需要时加载可见项目,从而提高性能。另一方面,Column是一个简单的容器组件,可将子项垂直排列。
何时不使用LazyColumn?
虽然LazyColumn在处理大型数据集时非常出色,但它在以下情况下可能不是最佳选择:
- 小型列表: 对于只有少数项目的列表,LazyColumn的开销可能会超过其收益。
- 固定大小列表: 对于大小固定的列表,例如仪表板上的图表或列表,LazyColumn的加载优化是不必要的。
- 可滚动内容有限的列表: 如果列表的内容在可见范围内完全可滚动,则LazyColumn提供的滚动优化也没有必要。
使用Column创建滑动列表
要使用Column创建滑动列表,我们需要:
- 添加一个滚动容器: 将Column包裹在带有垂直Scrollbar的ScrollableRow或VerticalScrollbar组件中。
- 指定固定高度: 为Column中的每个子项指定固定高度。这将允许滚动条准确计算可见区域的大小。
- 设置必要的填充: 在滚动容器的顶部和底部添加适当的填充,以防止子项超出可见区域。
代码示例
@Composable
fun VerticalListWithoutLazyColumn() {
val items = listOf("Item 1", "Item 2", "Item 3", "Item 4", "Item 5")
ScrollableRow(modifier = Modifier.verticalScrollbar(rememberScrollbarAdapter())) {
Column(modifier = Modifier.padding(vertical = 16.dp)) {
items.forEach {
Text(
text = it,
modifier = Modifier.height(50.dp)
)
}
}
}
}
性能比较
为了比较LazyColumn和Column在不同列表大小下的性能,我们进行了以下基准测试:
列表大小 | LazyColumn | Column |
---|---|---|
100 | 16.7ms | 5.4ms |
1000 | 158.1ms | 37.2ms |
10000 | 1543.2ms | 365.1ms |
结果表明,对于小型列表,Column明显快于LazyColumn。随着列表大小的增加,LazyColumn的性能优势变得更加明显。
结论
在Compose中使用Column创建滑动列表可以在不需要LazyColumn的情况下提供高性能的垂直列表。对于小型列表、固定大小列表或可滚动内容有限的列表,Column是比LazyColumn更轻量级、更具响应性的选择。通过采用适当的滚动容器、固定高度子项和填充,我们可以创建流畅、高效的列表组件。