【问题标题】:AsyncListDiffer is not updating the recyclerviewAsyncListDiffer 没有更新 recyclerview
【发布时间】: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()”来提交新列表。但它不起作用

我在网上找了解决方案,基本上有两种选择:

  1. submitList函数中,像这样调用AssyncListDiffer的“submitList”两次:

        differ.submitList(null)
        differ.submitList(list)
    }```
    
  2. 第二个选项是使用 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


【解决方案1】:

我遇到了同样的事情并观察到以下情况。

每次AsyncListDiffer收到我的名单;它与以前的对象相同 - 存在于内存中。因此,不同的决定没有任何改变,也没有提交更新的列表。

我的列表中包含一个对象,并且对于每次提交尝试,我都在更改一个字段。对象和列表当然保持不变。

所以,我想知道为什么选项 2 不起作用,结果我需要更有表现力:

submitList(it.map {
    it.copy()
})

否则,Kotlin 不会制作对象的深层副本。

【讨论】:

  • 有趣的解决方案。我试过你的方法。而不是整个列表闪烁,现在只有被单击的项目闪烁。但问题是更改没有出现在项目中。每当我单击回收站视图项时,它都应标记该复选框。但事实并非如此。我最终使用了 notifyItemChanged()。
  • 我认为如果你不介意继续的话,看看点击处理程序和 onBindViewHolder() 的实现可能会有所帮助;)
【解决方案2】:

往这边走

 fun submitList(list: MutableList<FollowingUserProfile>) {
        val x = mutableListOf<FollowingUserProfile>().apply{
            addAll(list)
        }
        differ.submitList(x)
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    相关资源
    最近更新 更多