我的RecyclerView和ListAdapter存在问题。
通过API,我会按照从旧到新的升序接收项目。
然后通过调用submitList(items)方法刷新我的列表。
但是,由于所有内容都是异步的,因此在收到第一个项目后,RecyclerView将保留在收到并显示的第一个项目的位置。因为在ListAdapter类中,当submitList()方法完成时没有回调,所以在找到已添加的新项之一后,我找不到滚动的方法。
ListAdapter更新后有没有办法拦截?
不是特定于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)
}
})
要覆盖的方法是:
public void onCurrentListChanged(List<T> previousList, List<T> currentList)
正如documentation所写:
当前
List
更新时调用。
ListAdapter
的内联文档内容如下:
这个类是围绕
AsyncListDiffer
的便利包装器,它实现了项目访问和计数的Adapter常见默认行为。
后来读到:
希望更多地控制适配器行为或提供特定基类的高级用户应参考
AsyncListDiffer
,它提供从diff事件到适配器位置的自定义映射。
这意味着,你需要扩展常规RecyclerView.Adapter
,结合AsyncListDiffer
的自定义实现;而不是ListAdapter
(这只是一个方便的包装,具有所述的基本功能)。
你可以使用ListAdapter
类作为模板(不扩展它,是线索),但结果类可以扩展和重用。否则就没有机会控制所需的回调。