Android - 添加新项目到 MutableLiveData 并观察
Android - Add new Items to MutableLiveData and observe
如何将新项目添加到 MutableLiveData 列表?我想构建一个无限滚动的 Recyclerview。所以我有一个包含 10 个项目的列表,在单击 "load more button" 之后我想添加十个新项目。
这是我的产品列表:
private companion object {
private var _products = MutableLiveData<MutableList<Product>>()
}
val products: LiveData<MutableList<Product>> = _products
Ant 这是我的加载函数:
fun loadProducts(category: Category) { // category: String
_isViewLoading.postValue(true)
AppService.fetchProducts(category, neuheitenCounter) { success, response ->
_isViewLoading.postValue(false)
if(success) {
when(category) {
Category.NEWS -> {
if(_products.value == null) {
_products.value = response?.products //as List<Product>
} else {
response?.let {
_products.value?.addAll(response?.products)
}
}
neuheitenCounter++
}
}
}
}
}
如果我调用 _products.value = response?.products
,它会触发我的 Activity 中的观察方法。但是,如果我调用 addAll
或 add
,则不会调用观察者方法。
实际上,这就是您应该如何更新适配器
- 向现有列表添加新项目
- 通过将相同的列表分配给它的值来通知 LiveData。 Here同题同解
- 当您的 Activity 收到列表已更改的通知时,它应该通过调用其 notifyDataSetChanged() 方法将更改通知适配器。
当您调用适配器的 notifyDataSetChanged()
方法时,它会将以前的项目与新项目进行比较,找出其中哪些项目已更改并更新 RecyclerView。您可以通过调用 notifyItemRangeInserted() 而不是 notifyDataSetChanged()
来帮助适配器。 notifyItemRangeInserted()
接受插入项目的范围,在您的情况下,您可以计算它,但要计算 adapter.itemCount
和 productList.size
之间的差异。
我有同样的问题。我在新的 List
中复制了 LiveData
的数据,然后我将 new data
添加到 new List
。并将 new List
分配给LiveData
。我知道这不是确切的解决方案,但这个解决了问题。
试试这个。
var tempList= _products.value
tempList.addAll(response?.products)
_products.value = tempList
希望对您有所帮助。
MutableLiveData.postValue(T value)
如何将新项目添加到 MutableLiveData 列表?我想构建一个无限滚动的 Recyclerview。所以我有一个包含 10 个项目的列表,在单击 "load more button" 之后我想添加十个新项目。
这是我的产品列表:
private companion object {
private var _products = MutableLiveData<MutableList<Product>>()
}
val products: LiveData<MutableList<Product>> = _products
Ant 这是我的加载函数:
fun loadProducts(category: Category) { // category: String
_isViewLoading.postValue(true)
AppService.fetchProducts(category, neuheitenCounter) { success, response ->
_isViewLoading.postValue(false)
if(success) {
when(category) {
Category.NEWS -> {
if(_products.value == null) {
_products.value = response?.products //as List<Product>
} else {
response?.let {
_products.value?.addAll(response?.products)
}
}
neuheitenCounter++
}
}
}
}
}
如果我调用 _products.value = response?.products
,它会触发我的 Activity 中的观察方法。但是,如果我调用 addAll
或 add
,则不会调用观察者方法。
实际上,这就是您应该如何更新适配器
- 向现有列表添加新项目
- 通过将相同的列表分配给它的值来通知 LiveData。 Here同题同解
- 当您的 Activity 收到列表已更改的通知时,它应该通过调用其 notifyDataSetChanged() 方法将更改通知适配器。
当您调用适配器的 notifyDataSetChanged()
方法时,它会将以前的项目与新项目进行比较,找出其中哪些项目已更改并更新 RecyclerView。您可以通过调用 notifyItemRangeInserted() 而不是 notifyDataSetChanged()
来帮助适配器。 notifyItemRangeInserted()
接受插入项目的范围,在您的情况下,您可以计算它,但要计算 adapter.itemCount
和 productList.size
之间的差异。
我有同样的问题。我在新的 List
中复制了 LiveData
的数据,然后我将 new data
添加到 new List
。并将 new List
分配给LiveData
。我知道这不是确切的解决方案,但这个解决了问题。
试试这个。
var tempList= _products.value
tempList.addAll(response?.products)
_products.value = tempList
希望对您有所帮助。
MutableLiveData.postValue(T value)