刷新项目列表的 MutableLiveData
Refreshing MutableLiveData of list of items
我在应用的架构组件中使用 LiveData 和 ViewModel。
我有一个分页的项目列表,我会在用户向下滚动时加载更多项目。查询的结果存储在
MutableLiveData<List<SearchResult>>
当我执行初始加载并将变量设置为新列表时,它会触发绑定适配器上的回调,将数据加载到 recyclerview 中。
但是,当我加载第 2 页并将其他项目添加到列表时,没有触发回调。但是,如果我用包含新旧项目的新列表替换该列表,则会触发回调。
是否可以让 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
我觉得这个扩展更好一点。
operator fun <T> MutableLiveData<ArrayList<T>>.plusAssign(values: List<T>) {
val value = this.value ?: arrayListOf()
value.addAll(values)
this.value = value
}
用法:
list += anotherList;
根据MutableLiveData,您需要使用postValue
或setValue
来触发观察者。
我在应用的架构组件中使用 LiveData 和 ViewModel。
我有一个分页的项目列表,我会在用户向下滚动时加载更多项目。查询的结果存储在
MutableLiveData<List<SearchResult>>
当我执行初始加载并将变量设置为新列表时,它会触发绑定适配器上的回调,将数据加载到 recyclerview 中。
但是,当我加载第 2 页并将其他项目添加到列表时,没有触发回调。但是,如果我用包含新旧项目的新列表替换该列表,则会触发回调。
是否可以让 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
我觉得这个扩展更好一点。
operator fun <T> MutableLiveData<ArrayList<T>>.plusAssign(values: List<T>) {
val value = this.value ?: arrayListOf()
value.addAll(values)
this.value = value
}
用法:
list += anotherList;
根据MutableLiveData,您需要使用postValue
或setValue
来触发观察者。