一、RecyclerView滑动监听
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState){ //滑动状态改变
super.onScrollStateChanged(recyclerView, newState);
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) { //滑动距离改变
super.onScrolled(recyclerView, dx, dy);
}
});
1、滑动情况
(1)开始滑动 -> 手指缓慢滑动 -> 停止滑动
(2)开始滑动 -> 手指快速滑动后抬起 -> 惯性滑动 -> 停止滑动
2、参数说明
(1)newState 滑动状态:
RecyclerView.SCROLL_STATE_DRAGGING 手指滑动
RecyclerView.SCROLL_STATE_SETTLING 惯性滑动
RecyclerView.SCROLL_STATE_IDLE 滑动停止
(2)dx 横向滑动过的距离:
正值:表示手指向左滑
负值:表示手指向右滑
(3)dy 纵向滑动过的距离:
正值:表示手指向上滑
负值:表示手指向下滑
二、判断RecyclerView是否滑到底部
1、computeVerticalScrollRange()等三个方法判断
public static boolean isSlideToBottom(RecyclerView recyclerView) {
if (recyclerView == null){
return false;
}
return recyclerView.computeVerticalScrollExtent() + recyclerView.computeVerticalScrollOffset()
>= recyclerView.computeVerticalScrollRange();
}
方法说明
computeVerticalScrollExtent() 当前屏幕显示的区域高度
computeVerticalScrollOffset() 当前屏幕之前滑过的距离
computeVerticalScrollRange() 整个View控件的高度
判断说明
当 屏幕显示的高度 + 屏幕之前滑过的距离 = 整个View控件的高度 时,说明控件没有超出屏幕底部的部分了,也就是滑动到最底部了
2、canScrollVertically(1)判断
public static boolean isSlideToBottom(RecyclerView recyclerView) {
return !recyclerView.canScrollVertically(1);
}
判断说明
RecyclerView.canScrollVertically(1) 的值表示是否能向上滚动,false表示已经滚动到底部
RecyclerView.canScrollVertically(-1) 的值表示是否能向下滚动,false表示已经滚动到顶部
3、lastVisibleItemPosition == totalItemCount - 1判断
public static boolean isSlideToBottom(RecyclerView recyclerView) {
LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
//屏幕中最后一个可见子项的position
int lastVisibleItemPosition = layoutManager.findLastVisibleItemPosition();
//当前屏幕所看到的子项个数
int visibleItemCount = layoutManager.getChildCount();
//当前RecyclerView的所有子项个数
int totalItemCount = layoutManager.getItemCount();
//RecyclerView的滑动状态
int state = recyclerView.getScrollState();
return visibleItemCount > 0 && lastVisibleItemPosition == totalItemCount - 1 && state == RecyclerView.SCROLL_STATE_IDLE;
}
判断说明
当屏幕中最后一个子项 lastVisibleItemPosition 等于所有子项个数 totalItemCount - 1,那么RecyclerView就到达了底部