当项目添加到 LiveData 列表时通知观察者

2023-12-13

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

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

观察者获取事件。但是当我只是将项目添加到值时,观察者就保持沉默。 您能否就如何实现我的需求提供建议?


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

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

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

Option 1

将列表保留在 LiveData 之外,并在列表内容发生更改时使用引用进行更新。

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

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

Option 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
}

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

UPDATE:

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当项目添加到 LiveData 列表时通知观察者 的相关文章

随机推荐