RecyclerView:如果有足够的空间容纳所有项目,则禁用滚动
RecyclerView: disable scroll if there is enough room for all items
我有一个巨大的 RecyclerView
和 GridLayoutManager
。
有时会显示少量项目,在这种情况下我需要禁用滚动。只有在 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()
returns false。
当所有项目都有足够的空间时,我尝试了很多方法来禁用滚动,但我一天都没有找到合适的方法来执行此操作。
我将不胜感激任何帮助!
在检查视图是否可滚动之前尝试启用滚动。
让我们看看 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)
以下代码适用于 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()
}
})
这在 Activity/Fragment 中调用,您可以在其中设置 recyclerView 的适配器
编辑:我实际上发现这种情况适用于更多情况:
if (recyclerView.computeVerticalScrollRange() < recyclerView.height)
我有一个巨大的 RecyclerView
和 GridLayoutManager
。
有时会显示少量项目,在这种情况下我需要禁用滚动。只有在 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()
returns false。
当所有项目都有足够的空间时,我尝试了很多方法来禁用滚动,但我一天都没有找到合适的方法来执行此操作。 我将不胜感激任何帮助!
在检查视图是否可滚动之前尝试启用滚动。
让我们看看 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)
以下代码适用于 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()
}
})
这在 Activity/Fragment 中调用,您可以在其中设置 recyclerView 的适配器
编辑:我实际上发现这种情况适用于更多情况:
if (recyclerView.computeVerticalScrollRange() < recyclerView.height)