gpt4 book ai didi

android - 将项目添加到 LiveData 列表时通知观察者

转载 作者:IT老高 更新时间:2023-10-28 13:28:19 25 4
gpt4 key购买 nike

当项目添加到 LiveData 列表时,我需要获取一个观察者事件。但据我了解,只有当我用新列表替换旧列表时,事件才会收到。例如当我做下一个时:

list.value = mutableListOf(IssuePost(UserEntity(name, email, photoUrl), issueEntity))

观察者得到事件。但是当我只是将 item 添加到 value 时,Observer 是沉默的。您能否就如何实现我需要的东西给我建议?

最佳答案

在内部,LiveData 以版本号的形式跟踪每个更改(简单的计数器存储为 int)。调用 setValue() 会增加此版本并使用新数据更新任何观察者(仅当观察者的版本号小于 LiveData 的版本时)。

看来启动此过程的唯一方法是调用 setValue() 或 postValue()。副作用是如果 LiveData 的底层数据结构发生了变化(例如向 Collection 添加元素),则不会发生任何事情来与观察者沟通。

因此,您必须在将项目添加到列表后调用 setValue()。我在下面提供了两种解决方法。

选项 1

将列表保留在 LiveData 之外,并在列表内容更改时随时更新引用。

private val mIssuePosts = ArrayList<IssuePost>()
private val mIssuePostLiveData = MutableLiveData<List<IssuePost>>()

fun addIssuePost(issuePost: IssuePost) {
mIssuePosts.add(issuePost)
mIssuePostLiveData.value = mIssuePosts
}

选项 2

通过 LiveData 跟踪列表,并在列表内容发生变化时使用自己的值更新 LiveData。

private val mIssuePostLiveData = MutableLiveData<MutableList<IssuePost>>()

init {
mIssuePostLiveData.value = ArrayList()
}

fun addIssuePost(issuePost: IssuePost) {
mIssuePostLiveData.value?.add(issuePost)
mIssuePostLiveData.value = mIssuePostLiveData.value
}

这些解决方案中的任何一个都可以帮助您不必在每次修改当前列表时都创建一个新列表来通知观察者。

更新:

我一直在使用类似的技术一段时间,正如 Gnzlt 在他的回答中提到的那样,使用 Kotlin 扩展函数将 LiveData 分配给自身以简化代码。这本质上是选项 2 自动化 :) 我建议这样做。

关于android - 将项目添加到 LiveData 列表时通知观察者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47941537/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com