android - 当我向我的 ListAdapter 提交新列表时,RecyclerView 不会使用更新的数据进行刷新
问题描述
我正在开发一个简单的应用程序,人们可以在其中将产品添加到购物篮(在 ProductsFragment 中),然后可以更改购物篮中产品的数量(在 BasketFragment 中)。我对两个片段都使用了带有 ListAdapter 的 RecyclerView。我正在使用在篮子周围包装一个 LiveData 实例,这样我就可以观察片段中的任何变化。当我更改通知片段的数量时,当发生这种情况时,我使用 ListAdapter 的 submitList() 方法仅刷新 recyclerview 中更改的数据。但是,DiffUtil areContentsTheSame() 方法始终返回 true,因此在我返回上一个片段并返回篮子或滚动列表之前,不会更新 RecyclerView 项目。
ViewModel
private val _basket = MutableLiveData<Basket>()
val basket: LiveData<Basket>
get() = _basket
fun onIncrementBasketProductQuantityButtonPressed(product: Product) {
val newProduct = product.copy(quantity = product.quantity.plus(1))
val newList= ArrayList(_basket.value!!.basket)
val newBasket = _basket.value!!.copy(basket = newList)
newBasket.updateProductInBasket(newProduct, newProduct.quantity)
_basket.value = newBasket
}
Basket
data class Basket(@Json(name = "basket") val basket: MutableList<Product> = arrayListOf()): Serializable {
fun updateProductInBasket(product: Product, quantity: Int) {
val p = findProduct(product)
if (p != null) {
p.quantity = quantity
p.setSubTotal()
} else {
addNewProductToBasket(product, quantity)
}
}
private fun addNewProductToBasket(product: Product, quantity: Int) {
product.quantity = quantity
product.setSubTotal()
this.basket.add(product)
}
private fun findProduct(product: Product) : Product? {
return this.basket.find { it.name == product.name && it.size == product.size }
}
}
解决方案
推荐阅读
- android - 如何在 Visual Studio 中为 Xamarin 项目创建单元测试?
- mysql - 使用 varchar 在 MYSQL 中创建函数,如果:为什么不编译?
- python - 从熊猫值计数创建新的数据框
- r - 如何删除由 scale_color_manual 引起的图例内的灰色方块?
- flutter - 在 null 上调用了方法“[]”。均匀的价值应该在那里
- typescript - 是否支持建议在 VS Code 中自动定义不存在的 TypeScript 类,例如在使用 TDD 时?
- mysql - 在 hadoop 上使用 sqoop 导入命令时出现错误
- android - 在预览窗口中等待构建完成
- tensorflow - 在 TF 2.0 中将 tf.Tensor 转换为 tf.data.Dataset.map(图形模式)中的 numpy 数组
- go - 在 golang 中发现可能为 nil 的深层结构的最佳实践