1

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

为什么? 因为当用户以足够快的速度点击项目时,不会触发点击监听器。用户不小心移动了 RecyclerView 一点。RecycleronTouchListener获取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。


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

4

2 回答 2

2

以下代码在 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() < recyclerView.height)

于 2019-06-12T17:31:19.093 回答
1

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

@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)
于 2019-01-28T22:52:06.973 回答