【问题标题】:How to wait for ListAdapter.submitList() to execute and call RecyclerView.smoothScrollToPosition(0);如何等待 ListAdapter.submitList() 执行并调用 RecyclerView.smoothScrollToPosition(0);
【发布时间】:2018-12-11 19:42:21
【问题描述】:
我有一个RecyclerView recyclerView,它链接到ListAdapter adapter。 “列表”从 Firebase 数据库获取新数据,“列表”根据某些对象属性进行排序。然后我打电话给adapter.submitList(list) 来更新recyclerView - 这非常有效!
但是,我希望 recyclerView 在添加新数据后滚动到列表顶部。但我看到adapter.submitList(list) 在单独的线程上运行。那么我将如何知道何时完成提交并致电recyclerView.smoothScrollToPosition(0);
如果我应该提供更多详细信息,请告诉我。
【问题讨论】:
标签:
android
android-recyclerview
listadapter
【解决方案1】:
ListAdapter 有另一个重载版本的 submitList() ListAdapter#submitList(@Nullable List<T> list, @Nullable final Runnable commitCallback),它将第二个参数作为 Runnable。
根据文档:
提交回调可用于知道何时提交列表,
但请注意,它
* 可能无法执行。如果列表 B 在列表 A 之后立即提交,并且是
* 直接提交,与List A关联的回调将不会运行。
用法:
listAdapter.submitList(*your_new_list*, new Runnable() {
@Override
public void run() {
// do your stuff
}
});
【解决方案2】:
您可以在您的 recyclerview 适配器上使用 AdapterDataObserver,这将在提交完成后发生:
adapter.registerAdapterDataObserver(object : RecyclerView.AdapterDataObserver() {
override fun onItemRangeInserted(positionStart: Int, itemCount: Int) {
when {
positionStart == 0 && itemCount != 0 -> {
mRecyclerView.smoothScrollToPosition(itemCount)
}
positionStart > 0 -> {
mRecyclerView.smoothScrollToPosition(adapter.itemCount)
}
}
}
})
小心 positionStart,项目计数值。还有其他回调。