![](/img/trans.png)
[英]What is the equivalent of [NestedScrollView + RecyclerView] or [Nested RecyclerView (Recycler inside another recycler) in Jetpack compose
[英]What is the Jetpack Compose equivalent of RecyclerView or ListView?
在 Jetpack Compose 中,如何在仅布置可见项目的同时显示大数据列表,而不是在初始布局过程中组合和布置每个项目? 这类似于View
工具包中的RecyclerView
和ListView
。
可以使用for
循环将Column
内的所有组件放置在VerticalScroller
,但这会导致丢帧和大量项目的性能不佳。
注意:这是一个规范的自我回答问题,以抢先/处理类似的问题
相当于成分RecyclerView
或ListView
在Jetpack的撰写是LazyColumn
用于垂直列表和LazyRow
用于水平列表。 它们仅组成和布置当前可见的项目。
您可以通过将数据格式化为列表并使用@Composable
回调传递它来使用它,该回调为列表中的给定项目发出 UI。 例如:
val myData = listOf("Hello,", "world!")
LazyColumn {
items(myData) { item ->
Text(text = item)
}
}
val myData = listOf("Hello,", "world!")
LazyRow {
items(myData) { item ->
Text(text = item)
}
}
您还可以一次指定单个项目:
LazyColumn {
item {
Text("Hello,")
}
item {
Text("world!")
}
}
LazyRow {
item {
Text("Hello,")
}
item {
Text("world!")
}
}
还有索引变体,除了提供项目本身之外,还提供集合中的索引:
val myData = listOf("Hello,", "world!")
LazyColumn {
itemsIndexed(myData) { index, item ->
Text(text = "Item #$index is $item")
}
}
val myData = listOf("Hello,", "world!")
LazyRow {
itemsIndexed(myData) { index, item ->
Text(text = "Item #$index is $item")
}
}
在以前的版本中,这些 API 被称为AdapterList
、 LazyColumnItems
/ LazyRowItems
和LazyColumnFor
/ LazyRowFor
。
dev.16 中的更新
从ListCardViewTemplate检查它的实现
你可以得到相同的本质RecyclerView
或ListView
使用JetpackCompose AdapterList
是在dev.14预览版改名。
[LazyColumnItems]
用于垂直滚动列表[LazyRowItems]
用于水平滚动列表检查什么是文档说:
它也被移动到一个
lazy
子包中并分成两个文件。 另外我重命名了参数:
- 数据 -> 项目。 这似乎比原始
data
更有意义- itemCallback -> itemContent。 这更有意义,我们通常不会在 lambda 名称中使用单词回调,尤其是对于可组合的 lambda
检查如何使用它:
@Composable
fun <T> LazyColumnItems(
items: List<T>,
modifier: Modifier = Modifier,
itemContent: @Composable (T) -> Unit
) {
LazyItems(items, modifier, itemContent, isVertical = true)
}
在.KT
LazyColumnItems(items = (0..50).toList()) { item ->
cardViewImplementer(item)
}
从我的角度来看,如果您的项目布局很复杂,则
LazyColumnItem
或LazyRowItem
无法正常工作,因为它卡在列表中,作为与VerticalScroller
在这种情况下工作正常的比较。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.