У меня есть 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 варианта:
В submitList , вызовите "submitList" AssyncListDiffer дважды следующим образом:
differ.submitList(null)
differ.submitList(list)
}```
- Второй вариант заключался в использовании ListAdapter и переопределении функции «submitList» следующим образом:
override fun submitList(list: List<Hour>?) {
super.submitList(list?.let { ArrayList(it) })
}
Первое решение работает, но recyclerview мигает всякий раз, когда я его обновляю. Второе решение по переопределению метода у меня не работает.
Я пытался исправить это несколько дней, но не могу заставить его работать. Кроме того, я не хочу использовать notifyItemChanged () или notifyDataSetChanged ().
Есть ли другой способ?