【问题标题】:Refreshing MutableLiveData of list of items刷新项目列表的 MutableLiveData
【发布时间】:2018-08-21 02:56:57
【问题描述】:

我在我的应用程序的架构组件中使用 LiveData 和 ViewModel。

我有一个分页的项目列表,当用户向下滚动时我会加载更多。查询的结果存储在一个

MutableLiveData<List<SearchResult>>

当我进行初始加载并将变量设置为新列表时,它会触发绑定适配器上的回调,将数据加载到 recyclerview 中。

但是,当我加载第二页并将其他项目添加到列表时,不会触发回调。但是,如果我将列表替换为包含新旧项目的新列表,则会触发回调。

是否可以让 LiveData 在更新后备列表时通知其观察者,而不仅仅是在更新 LiveData 对象时?

这不起作用(忽略空检查):

val results = MutableLiveData<MutableList<SearchResult>>()

/* later */

results.value.addAll(newResults)

这行得通:

val results = MutableLiveData<MutableList<SearchResult>>()

/* later */

val list = mutableListOf<SearchResult>()
list.addAll(results.value)
list.addAll(newResults)
results.value = list

【问题讨论】:

  • 我知道的唯一可能的方法是设置整个列表,以便通知观察者。可以在这里找到更好的技巧:stackoverflow.com/questions/48020377/…
  • 谢谢,这主要是一种解决方法,但我会尝试一下。

标签: android kotlin android-livedata android-architecture-components


【解决方案1】:

根据MutableLiveData,您需要使用postValuesetValue才能触发观察者。

【讨论】:

  • 他正在使用 Kotlin。 results.value 等于 results.setValue()
【解决方案2】:

我觉得这个扩展更好一点。

operator fun <T> MutableLiveData<ArrayList<T>>.plusAssign(values: List<T>) {
    val value = this.value ?: arrayListOf()
    value.addAll(values)
    this.value = value
}

用法:

list += anotherList;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-29
    • 2019-08-16
    • 1970-01-01
    • 2018-03-09
    • 1970-01-01
    • 2014-12-14
    • 1970-01-01
    相关资源
    最近更新 更多