Jetpack Compose 相当于 RecyclerView 或 ListView 是什么?

Rya*_*ley 14 android kotlin android-jetpack androidx android-jetpack-compose

在 Jetpack Compose 中,如何在仅布置可见项目的同时显示大数据列表,而不是在初始布局过程中组合和布置每个项目?这将是类似RecyclerViewListViewView工具包。

可以使用for循环将 aColumn中的所有组件放在 a中VerticalScroller,但这会导致丢帧和大量项目的性能不佳。


注意:这是一个规范的自我回答问题,以抢先/处理类似的问题

Rya*_*ley 31

Jetpack ComposeRecyclerViewListViewJetpack Compose 中的等效组件LazyColumn用于垂直列表和LazyRow水平列表。它们仅组成和布置当前可见的项目。

您可以通过将数据格式化为列表并使用@Composable回调传递它来使用它,该回调为列表中的给定项目发出 UI。例如:

val myData = listOf("Hello,", "world!")
LazyColumn {
    items(myData) { item ->
        Text(text = item)
    }
}
Run Code Online (Sandbox Code Playgroud)
val myData = listOf("Hello,", "world!")
LazyRow { 
    items(myData) { item ->
        Text(text = item)
    }
}
Run Code Online (Sandbox Code Playgroud)

您还可以一次指定单个项目:

LazyColumn {
    item {
        Text("Hello,")
    }
    item {
        Text("world!")
    }
}
Run Code Online (Sandbox Code Playgroud)
LazyRow { 
    item {
        Text("Hello,")
    }
    item {
        Text("world!")
    }
}
Run Code Online (Sandbox Code Playgroud)

还有索引变体,除了提供项目本身之外,还提供集合中的索引:

val myData = listOf("Hello,", "world!")
LazyColumn {
    itemsIndexed(myData) { index, item ->
        Text(text = "Item #$index is $item")
    }
}
Run Code Online (Sandbox Code Playgroud)
val myData = listOf("Hello,", "world!")
LazyRow { 
    itemsIndexed(myData) { index, item ->
        Text(text = "Item #$index is $item")
    }
}
Run Code Online (Sandbox Code Playgroud)

在以前的版本中,这些 API 被称为AdapterListLazyColumnItems/LazyRowItemsLazyColumnFor/ LazyRowFor

  • @SebasLG 目前没有这样的区别。在很大程度上,这是不必要的:如果您使用 Compose 状态变量来保存更改的内容,则子项将重新组合,而不会被视为新项目。 (3认同)