【问题标题】:How to disable recyclerview scrolling when observable item gets moved移动可观察项目时如何禁用recyclerview滚动
【发布时间】:2022-01-18 10:21:46
【问题描述】:

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

我在下面有一个可能的答案,但它有缺点。使用这种方法,recyclerview 确实会滚动到顶部,但只有在滚动到末尾之后才会滚动。这有点烦人。任何人都知道如何让它保持领先而不会走到尽头?

【问题讨论】:

    标签: android android-recyclerview


    【解决方案1】:

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

    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 保持在更改发生之前的任何滚动位置,而没有任何可察觉的移动。

    【讨论】:

      【解决方案2】:

      一种解决方法是在您的回收器视图适配器上注册 AdapterDataObserver,覆盖 onItemRangeInserted 方法,如下面的代码所示。当在位置 0 上插入内容时,它会自动触发 layoutManager 滚动到列表的开头。

      使用这种方法,recyclerview 确实会滚动到顶部,但只有在滚动到末尾之后。这有点烦人。任何人都知道如何让它保持领先而不会走到尽头?

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

      【讨论】:

        【解决方案3】:

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

        listAdapter.registerAdapterDataObserver(对象:RecyclerView.AdapterDataObserver(){ // 当项目位置改变时防止列表滚动 覆盖乐趣 onItemRangeMoved(fromPosition: Int, toPosition: Int, itemCount: Int) { 生命周期范围.launch { binding.manutenzioniList.scrollToPosition(fromPosition) } } })

        每次移动项目时,列表都会移回之前的位置。请注意,列表根本不会启动平滑滚动,因此没有任何烦人的来回滚动

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-08-12
          • 1970-01-01
          • 1970-01-01
          • 2016-11-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多