首页 > 解决方案 > 当我向我的 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 }
    }

}

标签: androidkotlinandroid-recyclerviewandroid-livedataandroid-viewmodel

解决方案


推荐阅读