AsyncListDiffer не обновляет recyclerview - PullRequest
1 голос
/ 09 мая 2020

У меня есть RecyclerView с адаптером, который использует AssyncListDiffer . У меня проблема в том, что recyclerview не обновляется , когда происходят изменения в LiveData. Наблюдатель получает уведомление, но список не обновляется.

Это мой адаптер:

class HourAdapter(private val interaction: HourInteraction? = null) :
RecyclerView.Adapter<HourAdapter.HourViewHolder>() {

    private val differ = AsyncListDiffer(this, DIFF_CALLBACK)

    fun submitList(list: List<Hour>?) {
        differ.submitList(list)
    }

    private fun getHourAt(position: Int): Hour {
        return differ.currentList[position]
    }

    override fun getItemCount(): Int {
        return differ.currentList.size
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): HourViewHolder {...}

    override fun onBindViewHolder(holder: HourViewHolder, position: Int) {...}

    val DIFF_CALLBACK = object : DiffUtil.ItemCallback<Hour>() {

      override fun areItemsTheSame(oldItem: Hour, newItem: Hour): Boolean {
        return (oldItem.name == newItem.name) && (oldItem.isChecked == newItem.isChecked)
        }

      override fun areContentsTheSame(oldItem: Hour, newItem: Hour): Boolean {
        return oldItem == newItem
       }

     }

    class HourViewHolder
        (
        internal val binder: HourItemBinding
    ) : RecyclerView.ViewHolder(binder.root)

}

Я использую « submitList () » для отправки нового список. Но это не работает .

Я искал решения в Интернете, и в основном было 2 варианта:

  1. В submitList , вызовите "submitList" AssyncListDiffer дважды следующим образом:

        differ.submitList(null)
        differ.submitList(list)
    }```
    
  2. Второй вариант заключался в использовании ListAdapter и переопределении функции «submitList» следующим образом:
  override fun submitList(list: List<Hour>?) {
  super.submitList(list?.let { ArrayList(it) })
  }

Первое решение работает, но recyclerview мигает всякий раз, когда я его обновляю. Второе решение по переопределению метода у меня не работает.

Я пытался исправить это несколько дней, но не могу заставить его работать. Кроме того, я не хочу использовать notifyItemChanged () или notifyDataSetChanged ().

Есть ли другой способ?

1 Ответ

1 голос
/ 24 мая 2020

Я пришел к тому же самому и заметил следующее:

Каждый раз, когда AsyncListDiffer получал мой список; это был тот же объект, что и раньше - присутствующий в памяти. Следовательно, разница решила, что ничего не изменилось, и не отправила обновленный список.

Мой список содержал внутри один объект, и для каждой попытки отправки я менял одно поле. Конечно, объект и список остались прежними. * В противном случае Kotlin не будет создавать глубокую копию объекта.

...