如何在可观察项目移动时禁用循环视图滚动



当我有第一个回收器查看位置0上的项目,然后假设有10个项目插入位置0,使第一个项目转到位置10时,回收器视图滚动到位置10。如何禁用此功能,使回收器视图保持在顶部?

我在下面有一个可能的答案,但也有不利之处。有了这个程序,Recycerview确实会滚动到顶部,但只有在滚动到最后之后。这有点烦人。有人知道如何让它保持领先而不走到最后吗?

我遇到了完全相同的问题-对我来说,当我的recyclerview显示的LiveData<List<Item>>以第一个项目更改位置的方式更新时,它总是滚动到该项目的新位置(但如果第一个项目以外的任何其他项目被移动,则不会(。我找到了一个相对简单的解决方案。在显示LiveDatafragmentrecylcerview中,您可能有这样的代码:

myViewModel.getAllItems().observe(getViewLifeCycleOwner(), items -> {
myAdapter.setItems(items);
});

要在移动第一个项目时停止滚动,只需在setItems()方法的两侧添加以下两行即可:

myViewModel.getAllItems().observe(getViewLifeCycleOwner(), items -> {
Parcelable recyclerViewState = myRecyclerView.getLayoutManager().onSaveInstanceState();
adapter.setItems(slItems);
myRecyclerView.getLayoutManager().onRestoreInstanceState(recyclerViewState);
});

如果要更改,这似乎可以恢复原始滚动位置,使UI停留在更改发生前的任何滚动位置,而没有任何可察觉的移动。

一种解决方法是在循环器视图适配器上注册AdapterDataObserver,覆盖以下代码中的onItemRangeInserted方法。当某个内容插入位置0时,它会自动触发layoutManager滚动到列表的开头。

有了这个程序,Recycerview确实会滚动到顶部,但只有在滚动到最后之后。这有点烦人。有人知道如何让它保持领先而不走到最后吗?

adapter?.registerAdapterDataObserver(object: RecyclerView.AdapterDataObserver() {
override fun onItemRangeInserted(positionStart: Int, itemCount: Int) {
if (positionStart == 0) layoutManager?.scrollToPosition(0)
}
})

受到КонсранринСемочкиа的启发,我找到了一个简单的解决方案:

listAdapter.registerAdapterDataObserver(对象:RecyclerView.AdapterDataObserver({//项目位置更改时阻止列表滚动override fun onItemRangeMoved(fromPosition:Int,toPosition:Int,itemCount:Int({lifecycleScope.launch{binding.manutenzioniList.sollToPosition(fromPosition(}}})

每次移动项目时,列表都会移回上一个位置。请注意,列表根本不会启动平滑滚动,因此没有任何令人讨厌的来回滚动

最新更新