等效于 Jetpack Compose Lazy Column/Row 中的 adapter.notifydatasetchange 或 Diffutils

Posted

技术标签:

【中文标题】等效于 Jetpack Compose Lazy Column/Row 中的 adapter.notifydatasetchange 或 Diffutils【英文标题】:Equivalent to adapter.notifydatasetchange or Diffutils in Jetpack Compose Lazy Column/Row 【发布时间】:2021-11-20 10:04:22 【问题描述】:

如何在 Jetpack Compose 中更新、删除或添加 LazyColumn 中的项目? 这很容易通过adapter.notifydatasetchangediffutils 在recyclerview 中实现

【问题讨论】:

【参考方案1】:

只需对您传递给items 函数的集合执行此操作即可。就这么简单。如果您的课程稳定(只需使用data class),您就可以了,它会正常工作。欢迎使用 Compose magic。

如果您想在更新/删除/添加方面获得最佳性能,请在 items 函数中公开一个稳定密钥,请参阅此处了解更多详细信息:https://developer.android.com/jetpack/compose/lists#item-keys

例子:

@Composable
fun MessageList(messages: List<Message>) 
    LazyColumn 
        items(
            items = messages,
            key =  message ->
                // Return a stable + unique key for the item
                message.id
            
        )  message ->
            // Display entry here
            MessageRow(message)
        
    

在这里,如果您提供密钥 lambda,则 compose 将知道该条目是相同的条目 - 只是内容不同。如果您不提供此 lambda - 列表中的索引将用作键。因此,除了列表末尾之外的任何添加都会触发大量重组。所以它或多或少有点像 diff utils。您只需要提供这个,因为内容相等性由 compose 隐式处理 - 通过 Message 对象的 equals

因此,如果您想从列表中删除一条消息 - 将其删除并将新列表传递给 MessageList。 Compose 会为您处理剩下的事情

【讨论】:

以上是关于等效于 Jetpack Compose Lazy Column/Row 中的 adapter.notifydatasetchange 或 Diffutils的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Jetpack Compose 中创建编辑器?

如何在jetpack compose中将contentColor应用于表面中的孩子

Jetpack Compose - MotionLayout

Jetpack Compose | 控件篇 -- SwitchCheckBoxRadioButton

Jetpack Compose | 控件篇 -- SwitchCheckBoxRadioButton

Jetpack Compose 折叠工具栏