我有一个布局,其中包含RecyclerView
由一些TextView
s 和 Horizo ntal 组成的项目的 Vertical RecyclerView
,因此它可以归结为经典的“列表列表”。
现在,可以单击列表中列表中的一项(我们称它们为孙子),这会改变自身和其他列表中的孙子。像这样的东西:
现在,事实证明,由于我们不知道哪个项目影响哪个列表,我们刷新整个顶层Adapter
和DiffUtil
它。而且由于它是一个列表列表,并且列表列表中的某些内容发生了变化,因此整个列表都被“刷新”了。这意味着我们不再跟踪列表滚动位置。
我最初尝试保持内部列表的滚动位置并在检测到更改时立即重置它们,但它很不稳定,您可以清楚地看到滚动位置转到列表的开头和一帧后,回到哪里它是。此外,其中一个列表恰好使用 a StaggeredGridLayoutManager
,当重新加载适配器并随机播放项目时,它无法正常工作,因此重置时位置可能不正确。
我做了一些技巧,使 internal ViewHolder
s 不可回收,并直接访问它们并传递新列表,但这意味着我们不能再依赖DiffCallback
,否则它会通知整个列表的更改。这就是问题再次出现的地方。
由于我们不再回收物品,也不依赖DiffCallback
,所以顶级物品没有变化通知,这意味着视图之外的物品没有得到通知,因此当它们来到视图时,它们'没有改变。
有没有办法在这种配置中完成修改其他孙子而不丢失滚动位置?