AsyncListDiffer 没有更新 recyclerview
AsyncListDiffer is not updating the recyclerview
我有一个 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()”提交新列表。但它不起作用。
我在网上找了解决方案,基本上有2种选择:
在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()。
还有其他方法吗?
我遇到了同样的事情并观察到以下内容。
每次AsyncListDiffer
收到我的名单;它与以前的对象相同 - 存在于内存中。因此,differ 决定什么都没有改变,也没有提交更新后的列表。
我的列表中包含一个对象,对于每次提交尝试,我都会更改一个字段。对象和列表当然保持不变。
所以,我想知道为什么选项 2 不起作用,结果证明我需要更具表现力:
submitList(it.map {
it.copy()
})
否则,Kotlin 不会对对象进行深度复制。
走这条路
fun submitList(list: MutableList<FollowingUserProfile>) {
val x = mutableListOf<FollowingUserProfile>().apply{
addAll(list)
}
differ.submitList(x)
}
我有一个 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()”提交新列表。但它不起作用。
我在网上找了解决方案,基本上有2种选择:
在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()。
还有其他方法吗?
我遇到了同样的事情并观察到以下内容。
每次AsyncListDiffer
收到我的名单;它与以前的对象相同 - 存在于内存中。因此,differ 决定什么都没有改变,也没有提交更新后的列表。
我的列表中包含一个对象,对于每次提交尝试,我都会更改一个字段。对象和列表当然保持不变。
所以,我想知道为什么选项 2 不起作用,结果证明我需要更具表现力:
submitList(it.map {
it.copy()
})
否则,Kotlin 不会对对象进行深度复制。
走这条路
fun submitList(list: MutableList<FollowingUserProfile>) {
val x = mutableListOf<FollowingUserProfile>().apply{
addAll(list)
}
differ.submitList(x)
}