【问题标题】: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,项目计数值。还有其他回调。

    【讨论】:

      【解决方案3】:

      正如@Chintan Soni 所说,您可以使用 submitList 提交回调。否则,如果您正在使用 kotlin 协程并希望等待动画结束,我建议您查看 awaitSomething() 模式。

      recyclerView.awaitScrollEnd() // custom suspend extension function
      

      Chris Banes 的更多内容:https://medium.com/androiddevelopers/suspending-over-views-19de9ebd7020

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-02-08
        • 1970-01-01
        • 2018-09-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-21
        • 1970-01-01
        相关资源
        最近更新 更多