我有一个RecyclerView recyclerView
链接到ListAdapter adapter
。 “列表”从Firebase数据库获取新数据,并且“列表”根据某些对象属性进行排序。然后,我致电adapter.submitList(list)
来更新recyclerView-这很完美!
但是,我希望recyclerView在添加新数据后滚动到列表顶部。但是我看到adapter.submitList(list)
在单独的线程上运行。那么我该如何知道提交和调用recyclerView.smoothScrollToPosition(0);
让我知道是否应该提供更多详细信息。
答案 0 :(得分:2)
ListAdapter的另一个重载版本的SubmitList()ListAdapter#submitList(@Nullable List<T> list, @Nullable final Runnable commitCallback)
将第二个参数作为Runnable。
根据文档
:可以使用commit回调来知道何时提交List, 但请注意 *可能不会执行。如果列表B在列表A之后紧接提交,并且是 *直接提交,将不会运行与列表A相关的回调。
用法:
listAdapter.submitList(*your_new_list*, new Runnable() {
@Override
public void run() {
// do your stuff
}
});
答案 1 :(得分:0)
您可以在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和项目计数值。还有其他回调。
答案 2 :(得分:0)
正如@Chintan Soni所说,您可以利用SubmitList commit回调。否则,如果您使用的是kotlin协程,并且想等待动画结束,我建议您看看awaitSomething()
模式。
recyclerView.awaitScrollEnd() // custom suspend extension function
Chris Banes的更多内容:https://medium.com/androiddevelopers/suspending-over-views-19de9ebd7020