DiffUtil не обновляет ListAdapter после обновления содержимого ArrayList - PullRequest
1 голос
/ 10 февраля 2020

Я пытаюсь обновить ArrayList, который находится внутри MutableLiveData. всякий раз, когда я изменяю содержимое в ArrayList, ListAdapter не обновляется.

ViewModel

private var _tileNumberList:MutableLiveData<ArrayList<TileNumber>> = MutableLiveData()

var tempTileNumberList: ArrayList<TileNumber> = ArrayList()

val tileNumberList:LiveData<ArrayList<TileNumber>>
get() = _tileNumberList

init {
    for (i in 1..9){
        for (j in 1..9){
            //tileNumberList.add(TileNumber(0,i,j))
            tempTileNumberList.add(TileNumber(0,i,j))
        }
    }

 fun onStart() {

        tempTileNumberList[count].number = 8
        _tileNumberList.value = tempTileNumberList
        count++

    }

всякий раз, когда я вызываю метод onStart, значения списка меняются, но ListAdapter не обновляется с последними значениями

MainActivity

backTrackingViewModel.tileNumberList.observe(this, Observer {
               it?.let {
                   //adapter.submitList(null)
                   adapter.submitList( it)
               }
            Toast.makeText(
                applicationContext,
                "Hey",
                Toast.LENGTH_SHORT
            ).show()
        })

когда я устанавливаю adapter.submitList (null), тогда мой ListAdapter обновляется

TileNumber

data class TileNumber(var number:Int,val row:Int,val column:Int) {
}

Я пробовал ссылки этой ссылки, но не работал

ListAdapter не обновляет элемент в RecyclerView

{ ссылка } (это не очень хорошее решение)

DiffUtil ItemCallback areContentsTheSame () всегда возвращает true после обновления элемента в ListAdapter

Ответы [ 2 ]

0 голосов
/ 10 февраля 2020

У меня есть два возможных варианта, почему этот код не работает:

  1. Элементы меняются на месте - т.е. вы меняете элементы внутри списка. Поскольку список передается адаптеру, список адаптера также изменяется. Решение:

    _tileNumberList.value = tempTileNumberList.toList ()

  2. Вы не изменили equals () и hashCode () для класса TileNumber.

0 голосов
/ 10 февраля 2020

Я думаю, вы должны инициализировать список tileNumberList следующим образом

var tileNumberList: LiveData<ArrayList<TileNumber>> =  _tileNumberList

И затем наблюдать это в MainActivity так же, как вы это делаете

...