Когда я отправляю новый список в свой ListAdapter, RecyclerView не обновляется с обновленными данными - PullRequest
0 голосов
/ 28 июня 2019

Я занимаюсь разработкой простого приложения, в котором люди могут добавлять товары в корзину (в фрагменте Products), а затем изменять количество товаров в корзине (в элементе BasketFragment). Я использую RecyclerView с ListAdapter для обоих фрагментов. Я использую обертывание экземпляра LiveData вокруг корзины, чтобы я мог наблюдать любые изменения во фрагменте. Когда я изменяю количество, фрагмент уведомляется, и когда это происходит, я использую метод submitList () ListAdapter, чтобы обновить только измененные данные в представлении реселлера. Однако метод 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 }
    }

}
...