【发布时间】:2019-03-20 13:53:21
【问题描述】:
我正在使用 RecyclerView 和 AsyncListDiffer(计算新旧项目之间的差异并为其设置动画,全部在后台线程上)。
我有一个按钮来对列表进行排序。在我对其进行排序并使用mDiffer.submitList(items); 将其重新设置为RecyclerView 之后,我还调用recyclerView.scrollToPosition(0) 或(smoothScrollToPosition(0)),但它没有效果。
我认为这种行为是意料之中的,因为AsyncListDiffer 在调用scrollToPosition(0) 时可能仍在计算差异,因此它没有任何效果。此外,默认情况下AsyncListDiffer 不会滚动回顶部,而是将 RecyclerView 保持在相同的状态。
但是我如何告诉RecyclerView 在AsyncListDiffer 完成并更新它之后滚动到顶部?
【问题讨论】:
-
您是否尝试过在提交新项目之前滚动?也许这不是您需要的解决方案,但至少可以知道操作失败是因为
AsyncListDiffer仍在运行还是因为其他原因。 -
我刚试过,没用。我还刚刚注意到,当我对列表进行排序并提交时,
RecyclerView项目没有重新绑定(刷新)。我必须往下拉一点,然后我才能看到已排序的项目。但这可能是另一个问题.. -
也许其他问题可能会有所帮助stackoverflow.com/questions/41357303/… 和stackoverflow.com/questions/30845742/… 关于重新绑定,看起来您可能对稳定的 ID 有问题。你能提供你的适配器代码吗?替代。见medium.com/@hanru.yeh/…
-
底线:要么禁用适配器中的稳定 ID
adapter.setHasStableIds(false),或者更好的是,确保它们已启用adapter.setHasStableIds(true)并覆盖适配器中的long getItemId(int position)以返回 唯一 每个元素的 ID。 -
很奇怪,但很高兴知道。感谢分享解决方案!
标签: android android-recyclerview android-asynclistdiffer android-diffutils