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