如何等待ListAdapter.submitList()执行并调用RecyclerView.smoothScrollToPosition(0);

时间:2018-12-11 19:42:21

标签: android android-recyclerview listadapter

我有一个RecyclerView recyclerView链接到ListAdapter adapter。 “列表”从Firebase数据库获取新数据,并且“列表”根据某些对象属性进行排序。然后,我致电adapter.submitList(list)来更新recyclerView-这很完美!

但是,我希望recyclerView在添加新数据后滚动到列表顶部。但是我看到adapter.submitList(list)在单独的线程上运行。那么我该如何知道提交和调用recyclerView.smoothScrollToPosition(0);

的时间

让我知道是否应该提供更多详细信息。

3 个答案:

答案 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