检查 RecyclerView 是否可滚动

Check if RecyclerView is scrollable

如何检查 RecyclerView 是否可滚动,即可见区域 below/above 是否有项目

我的回收站视图中有一个下拉菜单,它通过使用 notifyItemRangeInserted()notifyItemRangeRemoved() 来工作。每当发生这种情况时,我想检查 RecyclerView 是否可滚动,因为我必须相应地调整另一个视图,像报亭中的横幅一样

想法是检查最后一个完全可见的元素是否是列表中的最后一个元素。

private boolean isScrollable()
{
    return mLinearLayoutManager.findLastCompletelyVisibleItemPosition() + 1 ==
        mRecyclerViewAdapter.getItemCount();
}

好了:

public boolean isRecyclerScrollable() {
  LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
  RecyclerView.Adapter adapter = recyclerView.getAdapter();
  if (layoutManager == null || adapter == null) return false;

  return layoutManager.findLastCompletelyVisibleItemPosition() < adapter.getItemCount() - 1;
}
boolean isScrollable() {
    LinearLayoutManager layoutManager = (LinearLayoutManager) mRecyclerView.getLayoutManager();
    int itemCount = mRecyclerView.getAdapter().getItemCount();

    return !(itemCount == 0 ||
    (layoutManager.findFirstCompletelyVisibleItemPosition() == 0 &&
    layoutManager.findLastCompletelyVisibleItemPosition() == itemCount - 1));
}

我找到了一个简单的解决方案,无论您在列表中的位置如何:

public boolean isRecyclerScrollable(RecyclerView recyclerView) {
    return recyclerView.computeHorizontalScrollRange() > recyclerView.getWidth() || recyclerView.computeVerticalScrollRange() > recyclerView.getHeight();
}

这个适合我。

recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {

        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);


            boolean isRecylerScrollable = recyclerView.computeHorizontalScrollRange() > recyclerView.getWidth();

            if(isRecylerScrollable){
             //do something
            }
    });
}

怎么样

// 1 = down; -1 = up
recyclerView.canScrollVertically(-1)

如果要检查是否有可滚动space,无论哪个方向

cardList.canScrollVertically(1) || cardList.canScrollVertically(-1)

Kotlin 中你可以这样做:

 fun isRecyclerScrollable(): Boolean {
    val layoutManager = recyclerView.layoutManager as LinearLayoutManager
    val adapter = recyclerView.adapter
    return if (adapter == null) false else layoutManager.findLastCompletelyVisibleItemPosition() < adapter.itemCount - 1
}

我遇到了同样的问题,答案已经发布,尤其是 Fabios,使我走上了正确的道路。但是 scrollRange 不支持填充,因此如果您的 Recyclerview 有填充,也需要考虑它们。

我现在在 Kotlin 中使用以下扩展 属性 来确定视图是否在滚动。

/**
 * computes whether the RecyclerView's content is larger than the view container, i.e. whether or not the user can scroll
 * returns null if either layout manager or adapter is not yet set or an incompatible layout manager is used (Linear- & GridLayoutManager work)
 */
val RecyclerView.canScroll: Boolean?
    get() {
        // if there's no adapter set, we don't know yet whether or not the view is scrollable
        if (adapter == null) return null
        val manager = layoutManager as? LinearLayoutManager ?: return null
        if (manager.orientation == RecyclerView.HORIZONTAL) {
            return computeHorizontalScrollRange() + paddingLeft + paddingRight > width
        }
        return computeVerticalScrollRange() + paddingTop + paddingBottom > height
    }

使用这种方法:

recyclerView.viewTreeObserver.addOnScrollChangedListener {
    val canScrollUp = recyclerView.canScrollVertically(-1)
    val canScrollDown = recyclerView.canScrollVertically(1)
}
  1. 首先创建一个布尔值来检查循环。
  2. 添加 onScrolled 监听器:
binding.rvInformation.addOnScrollListener(object : RecyclerView.OnScrollListener() {
           override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
               super.onScrolled(recyclerView, dx, dy)
               if (!scrollChecked) { // <- check the 1 loop
                   scrollChecked = true
                   if (binding.rvInformation.canScrollVertically(1)) {
                       // Can scroll
                   } else {
                       // Can't scroll
                   }
               }

           }
       })