RecyclerView:如果所有项目都有足够的空间,请禁用滚动

时间:2019-01-28 16:58:33

标签: android kotlin scroll android-recyclerview disable

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

为什么? 因为当用户在项目上单击足够快时,不会触发单击侦听器。用户不小心稍微移动了RecyclerView。回收者的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。


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

2 个答案:

答案 0 :(得分:1)

在检查视图是否可滚动之前,请尝试启用滚动。 让我们看看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)

答案 1 :(得分: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设置了适配器

编辑:实际上,我发现这种情况在更多情况下仍然有效:

if (recyclerView.computeVerticalScrollRange() < recyclerView.height)