【问题标题】:RecyclerView: disable scroll if there is enough room for all itemsRecyclerView:如果所有项目都有足够的空间,则禁用滚动
【发布时间】:2019-06-21 17:47:36
【问题描述】:

我有一个巨大的RecyclerViewGridLayoutManager。 有时会显示少量项目,在这种情况下我需要禁用滚动。只有在 RecyclerView 中显示的项目过多时才应启用滚动,因此需要滚动。

为什么? 因为当用户在项目上单击得足够快时,不会触发单击侦听器。用户不小心移动了 RecyclerView 一点。 Recycler 的onTouchListener 获取EVENT_MOVE 并消费该事件。

我尝试使用重写的 canScrollVertically() 方法创建自定义 GridLayoutManager:

override fun canScrollVertically(): Boolean {
    return super.canScrollVertically() && isScrollEnabled
}

我使用这个函数来检查 RecyclerView 是否可滚动:

fun RecyclerView.isScrollableVertically(): Boolean {
    return computeVerticalScrollRange() > height
}

然后,我更新 isScrollEnable 字段:

val isScrollableVertically = items_list.isScrollableVertically()
(category_items_list.layoutManager as CustomGridLayoutManager).setScrollEnabled(isScrollableVertically)

但即使有很多项目要显示,items_list.isScrollableVertically() 也会返回 false。


当所有项目都有足够的空间时,我正在尝试很多方法来禁用滚动,但我一天都没有找到合适的方法来做到这一点。 我将不胜感激!

【问题讨论】:

    标签: android kotlin scroll android-recyclerview disable


    【解决方案1】:

    以下代码在 Kotlin 中适用于我:

    recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() {
        override fun onScrollStateChanged( recyclerView: RecyclerView, newState: Int) {
            super.onScrollStateChanged(recyclerView, newState)
                // recyclerView.layoutManager!!.childCount) returns the number of visible items
                if (data.size <= recyclerView.layoutManager!!.childCount)
                    recyclerView.stopScroll()
                }
    })
    

    这在您为 recyclerView 设置适配器的 Activity/Fragment 中调用

    编辑:我实际上发现这种情况适用于更多情况:

    if (recyclerView.computeVerticalScrollRange() &lt; recyclerView.height)

    【讨论】:

      【解决方案2】:

      在检查视图是否可滚动之前尝试启用滚动。 让我们看看computeVerticalScrollRange方法的实现(java)。

      @Override
      public int computeVerticalScrollRange() {
          if (mLayout == null) {
              return 0;
          }
          return mLayout.canScrollVertically() ? mLayout.computeVerticalScrollRange(mState) : 0;
      }
      

      一旦您禁用滚动,您将始终获得零滚动范围。所以我认为这应该会有所帮助

      // set 'isScrollEnabled' true    
      (category_items_list.layoutManager as CustomGridLayoutManager).setScrollEnabled(true)
      
      val isScrollableVertically = items_list.isScrollableVertically()
      (category_items_list.layoutManager as CustomGridLayoutManager).setScrollEnabled(isScrollableVertically)
      

      【讨论】:

      • 非常感谢!我想补充一点,我在以这种方式更新 RecyclerView 的数据集后更新 setScrollEnabled():recycler_view.post { /* scroll check here*/ }
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      • 2021-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多