gpt4 book ai didi

android - 如果我提交具有不同项目顺序的相同列表,ListAdapter 不会刷新 RecyclerView

转载 作者:搜寻专家 更新时间:2023-11-01 07:41:57 24 4
gpt4 key购买 nike

我正在使用带有 ListAdapterRecyclerView (当列表被替换时,它使用 AsyncListDiffer 来计算和动画变化)。

问题是,如果我 submit() 一些列表,然后重新排序该列表,然后再次 submit(),什么也不会发生。

如何强制 ListAdapter 评估这个新列表,即使它“相同”(但顺序已更改)?

新发现:

我检查了 submitList() 的源代码在开始时有一张支票:

public void submitList(@Nullable final List<T> newList) {
final int runGeneration = ++this.mMaxScheduledGeneration;
if (newList != this.mList) {

我认为这是问题所在。但是如何度过呢?我的意思是,开发人员肯定考虑过提交不同的有序列表?

最佳答案

代替

submitList(mySameOldListThatIModified)

您必须像这样提交一个新列表:

ArrayList newList = new ArrayList(oldList);
newList.add(somethingNew); // Or sort or do whatever you want
submitList(newList);

API 有点问题。我们希望 ListAdapter 保留列表的副本,但它没有,可能是出于内存原因。当您更改旧列表时,您实际上是在更改 ListAdapter 存储的同一个列表。当 ListAdapter 检查 if (newList != this.mList) newListmList 都引用同一个列表实例,因此无论您对该列表进行了哪些更改,它都等于自身,并忽略您的更新。

在 kotlin 中,您可以通过以下方式创建新列表:

val newList = oldList.toMutableList() // Unintuitive way to copy a list
newList[0] = newList[0].copy(isFavourite = false) // Do whatever modifications you want
submitList(newList)

请注意,您不能这样做:

newList.first().isFavourite = false

因为这也会更改旧列表中的第一项,而且 ListAdapter 也不会看到旧列表中的第一项和新列表中的第一项之间的差异。我建议您列表中的所有项目都独占 val 属性,以避免此问题。

关于android - 如果我提交具有不同项目顺序的相同列表,ListAdapter 不会刷新 RecyclerView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55263384/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com