【发布时间】:2020-05-09 12:49:03
【问题描述】:
我有一个带有适配器的 RecyclerView,该适配器使用 AssyncListDiffer。我遇到的问题是,当 LiveData 发生更改时,recyclerview 未更新。观察者收到通知,但列表没有更新。
这是我的适配器:
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()”来提交新列表。但它不起作用。
我在网上找了解决方案,基本上有两种选择:
-
在submitList函数中,像这样调用AssyncListDiffer的“submitList”两次:
differ.submitList(null) differ.submitList(list) }``` - 第二个选项是使用 ListAdapter 并像这样覆盖“submitList”函数:
override fun submitList(list: List<Hour>?) {
super.submitList(list?.let { ArrayList(it) })
}
第一个解决方案有效,但每当我更新它时,recyclerview 闪烁。 覆盖该方法的第二种解决方案对我不起作用。
我已经尝试解决这个问题好几天了,但我无法让它工作。另外,我不想使用 notifyItemChanged() 或 notifyDataSetChanged()。
还有其他方法吗?
【问题讨论】:
-
您是否尝试过将differ.submitList(list) 改为differ.submitList(list.toMutableList())?
-
@CôngHải 我刚刚做了,但它仍然不起作用。
-
能否在 DiffUtils 中附加代码
-
@CôngHải 刚刚编辑了问题。
-
你在哪里调用
submitlist函数?在哪里?
标签: android kotlin android-recyclerview android-diffutils android-asynclistdiffer