ListAdapter submitList() - 如何滚动到开头

问题描述 投票:11回答:2

我的RecyclerView和ListAdapter存在问题。

通过API,我会按照从旧到新的升序接收项目。

然后通过调用submitList(items)方法刷新我的列表。

但是,由于所有内容都是异步的,因此在收到第一个项目后,RecyclerView将保留在收到并显示的第一个项目的位置。因为在ListAdapter类中,当submitList()方法完成时没有回调,所以在找到已添加的新项之一后,我找不到滚动的方法。

ListAdapter更新后有没有办法拦截?

android android-recyclerview listadapter
2个回答
8
投票

不是特定于ListAdapter,但它应该工作:

只需使用adapter.registerAdapterDataObserver(RecyclerView.AdapterDataObserver)并覆盖相关的onItemXXX方法,告诉您的RecyclerView滚动到任何位置。

举个例子:

    adapter.registerAdapterDataObserver(object : RecyclerView.AdapterDataObserver() {
        override fun onItemRangeInserted(positionStart: Int, itemCount: Int) {
            (recycler_view.layoutManager as LinearLayoutManager).scrollToPositionWithOffset(positionStart, 0)
        }
    })

3
投票

要覆盖的方法是:

public void onCurrentListChanged(List<T> previousList, List<T> currentList)

正如documentation所写:

当前List更新时调用。


ListAdapter的内联文档内容如下:

这个类是围绕AsyncListDiffer的便利包装器,它实现了项目访问和计数的Adapter常见默认行为。

后来读到:

希望更多地控制适配器行为或提供特定基类的高级用户应参考AsyncListDiffer,它提供从diff事件到适配器位置的自定义映射。

这意味着,你需要扩展常规RecyclerView.Adapter,结合AsyncListDiffer的自定义实现;而不是ListAdapter(这只是一个方便的包装,具有所述的基本功能)。

你可以使用ListAdapter类作为模板(不扩展它,是线索),但结果类可以扩展和重用。否则就没有机会控制所需的回调。

© www.soinside.com 2019 - 2024. All rights reserved.