RecyclerView 的滚动事件 OnScrollListener

RecyclerView 的滚动事件

滚动事件的分类

列表的滚动分类一般分为两种

    1. 手指按下 ----> 手指拖动列表移动-----> 手指停止拖拽 -----> 抬起手指
    1. 手指按下 ----> 手指快熟拖拽后抬起手指 ----> 列表继续滚动 ----> 停止滚动

上面的过程状态变化如下 :

    1. 静止---->被迫拖拽移动---->静止
    1. 静止---->被迫拖拽移动----> 自己滚动---->静止

监听 RecyclerView的滚动

有两种方式可以监听滚动事件:
1、setOnScrollListener (OnScrollListener listener)
2、addOnScrollListener (OnScrollListener listener)
其中 setOnScrollListener (OnScrollListener listener) 由于有可能出现空指针异常的风险 ,已经过时。建议用 addOnScrollListener。

OnScrollListener

OnScrollListener 类是个抽象类,有两个方法:


void onScrollStateChange(RecyclerView recyclerView , int newState)  // 滚动状态变化时回调

void onScrolled(RecyclerView recyclerView ,int dx,int dy) // 滚动时回调

onScrollStateChange(RecyclerView recyclerView , int newState) 方法

回调的两个变量的含义:
RecycleView : 当前在滚动的RecyclerView
newState : 当前滚动的状态

其中 newState 有三种值:

/**
 * The recyclerView is not currently scrolling. () 静止没有滚动
 */
public static final int SCROLL_STATE_IDLE = 0;

/**
 * The recyclerView is currently being dragged by outside input such as user touch input.
 * (正在被外部拖拽,一般为用户正在手指滚动)
 */
public static final int SCROLL_STATE_DRAGGING = 1;

/**
 * The recyclerView is currently animating to a final poistion while not under outside control.
 * (自动滚动)
 */
public static final int SCROLL_STATE_SETTLING = 2;

onScrollListener(RecyclerView recyclerView, int dx, int dy) 方法

回调的三个变量含义:
recyclerView : 当前滚动的view
dx : 水平滚动距离
dy : 垂直滚动距离

dx > 0 时为手指向左滚动,列表滚动显示右面的内容
dx < 0 时为手指向右滚动,列表滚动显示左面的内容
dy > 0 时为手指向上滚动,列表滚动显示下面的内容
dy < 0 时为手指向下滚动,列表滚动显示上面的内容

canScrollVertically和canScrollHorizontally方法

public boolean canScrollVertically(int direction)
//这个方法是判断view在竖直方向是否还能向上、向下滑动
//其中,direction 为 -1 表示手指向下滑动(屏幕向上滑动),1 表示手指向上滑动(屏幕向下滑动)。

public boolean canScrollHorizontally (int direction)
//这个方法用来判断 水平方向的滑动

两种判断是否到底部的方法

方法一:

如果当前第一个可见item的位置 + 当前可见的item个数 >= item的总个数这样就可以判断出来,是在底部了。
通过visibleItemCount + pastVisiblesItems) >= totalItemCount来判断是否是底部。

方法二:

通过 canScrollVertically 来判断

loadingMoreListener = new RecyclerView.OnScrollListener() {
    @Override
    public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
        super.onScrollStateChanged(recyclerView, newState);
        if(!loading && !recyclerView.canScrollVertically(1)){
            loading = true;
            loadMoreDate();
        }
    }
 
    @Override
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
        super.onScrolled(recyclerView, dx, dy);
 
//                if (dy > 0) //向下滚动
//                {
//                    int visibleItemCount = mLinearLayoutManager.getChildCount();
//                    int totalItemCount = mLinearLayoutManager.getItemCount();
//                    int pastVisiblesItems = mLinearLayoutManager.findFirstVisibleItemPosition();
//
//                    if (!loading && (visibleItemCount + pastVisiblesItems) >= totalItemCount) {
//                        loading = true;
//                        loadMoreDate();
//                    }
//                }
    }

你可能感兴趣的:(RecyclerView 的滚动事件 OnScrollListener)