列表的滚动一般分为两种
手指按下 -> 手指拖拽列表移动 -> 手指停止拖拽 -> 抬起手指
手指按下 -> 手指快速拖拽后抬起手指 -> 列表继续滚动 -> 停止滚动
滚动状态分别为
静止
滚动 (被迫拖拽移动,自己滚动)
过程状态变化如下
静止 -> 被迫拖拽移动 -> 静止
静止 -> 被迫拖拽移动 -> 自己滚动 -> 静止
监听RecyclerView的滚动
两种监听
1.setOnScrollListener() ,此方法已过时
2.addOnScrollListener()
2.addOnScrollListener()
设置监听器源码
public abstract static class OnScrollListener {
/**
* Callback method to be invoked when RecyclerView's scroll state changes.
* @param recyclerView The RecyclerView whose scroll state has changed.
* @param newState The updated scroll state. One of {@link #SCROLL_STATE_IDLE},
* {@link #SCROLL_STATE_DRAGGING} or {@link #SCROLL_STATE_SETTLING}.
*/
public void onScrollStateChanged(RecyclerView recyclerView, int newState){}
/**
* Callback method to be invoked when the RecyclerView has been scrolled. This will be
* called after the scroll has completed.
* <p>
* This callback will also be called if visible item range changes after a layout
* calculation. In that case, dx and dy will be 0.
*
* @param recyclerView The RecyclerView which scrolled.
* @param dx The amount of horizontal scroll.
* @param dy The amount of vertical scroll.
*/
public void onScrolled(RecyclerView recyclerView, int dx, int dy){}
}
在滚动过程中,监听器会调用两个方法()
onScrollStateChanged : 滚动状态变化时回调(状态)
onScrolled : 滚动时回调(过程)
onScrolled : 滚动时回调(过程)
onScrollStateChanged 方法
在void onScrollStateChanged(RecyclerView recyclerView, int newState)
中回调两个变量:
-
recyclerView : 当前在滚动的RecyclerView
-
newState : 当前滚动状态.
其中newState有三种值:
//正在滚动
public static final int SCROLL_STATE_IDLE = 0;
//正在被外部拖拽,一般为用户正在用手指滚动
public static final int SCROLL_STATE_DRAGGING = 1;
//自动滚动开始
public static final int SCROLL_STATE_SETTLING = 2;
onScrolled 方法
在void onScrolled(RecyclerView recyclerView, int dx, int dy)
方法中回调了三个变量:
-
recyclerView : 当前滚动的view
-
dx : 水平滚动距离
-
dy : 垂直滚动距离
滚动方向
dy > 0 时为向上滚动
dy < 0 时为向下滚动
dy < 0 时为向下滚动
回调过程
缓慢拖拽回调过程:
1. newState = RecyclerView.SCROLL_STATE_DRAGGING;
2. dy 多次改变
3. newState = RecyclerView.SCROLL_STATE_IDLE
快速滚动回调过程:
1. newState = RecyclerView.SCROLL_STATE_DRAGGING;
2. dy 多次改变
3. newState = RecyclerView.SCROLL_STATE_SETTLING;
4. dy 多次改变
5. newState = RecyclerView.SCROLL_STATE_IDLE;
RecyclerView.canScrollVertically(1)
的值表示是否滚动到
底部
RecyclerView.canScrollVertically(-1)
的值表示是否滚动到
顶部
封装
建立事件监听的接口
OnScrollCallback
public interface OnScrollCallback {
void onStateChanged(ScrollRecycler recycler, int state);
void onScrollUp(ScrollRecycler recycler, int dy);
void onScrollDown(ScrollRecycler recycler, int dy);
}
ScrollRecycler
继承
RecyclerView
,在类中添加以下方法:
public void setOnScrollCallback(final OnScrollCallback callback) {
if (callback == null) {
return;
}
addOnScrollListener(new OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
callback.onStateChanged(ScrollRecycler.this, newState);
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
if (dy > 0) {
callback.onScrollDown(ScrollRecycler.this, dy);
} else {
callback.onScrollUp(ScrollRecycler.this, dy);
}
}
});
}