RecyclerView的滚动事件OnScrollListener研究
来源:互联网 发布:手机摄像头透视软件 编辑:程序博客网 时间:2024/05/21 07:04
(1)滚动事件分类
列表的滚动一般分为两种:
1.手指按下 -> 手指拖拽列表移动 -> 手指停止拖拽 -> 抬起手指 2.手指按下 -> 手指快速拖拽后抬起手指 -> 列表继续滚动 -> 停止滚动
上面的过程的状态变化如下:
1.静止 -> 被迫拖拽移动 -> 静止2.静止 -> 被迫拖拽移动 -> 自己滚动 -> 静止
(2)监听RecyclerView的滚动
有两种方式可以监听滚动事件:
1.setOnScrollListener(OnScrollListener listener) //被废弃 2.addOnScrollListener(OnScrollListener listener)
其中 setOnScrollListener 由于可能出现空指针的风险,已经过时。建议用addOnScrollListener。
(3)OnScrollListener
/** * An OnScrollListener can be added to a RecyclerView to receive messages when a scrolling event * has occurred on that RecyclerView. * <p> * @see RecyclerView#addOnScrollListener(OnScrollListener) * @see RecyclerView#clearOnChildAttachStateChangeListeners() * */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){}}
OnScrollListener类是个抽象类,有两个方法:
void onScrollStateChanged(RecyclerView recyclerView, int newState): 滚动状态变化时回调void onScrolled(RecyclerView recyclerView, int dx, int dy): 滚动时回调
3.1 onScrollStateChanged(RecyclerView recyclerView, int newState)方法
回调的两个变量的含义:
recyclerView: 当前在滚动的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 position while not under outside control. *(自动滚动) */public static final int SCROLL_STATE_SETTLING = 2;
3.2 onScrolled(RecyclerView recyclerView, int dx, int dy)方法
回调的三个变量含义:
recyclerView : 当前滚动的view
dx : 水平滚动距离
dy : 垂直滚动距离
dx > 0 时为手指向左滚动,列表滚动显示右面的内容
dx < 0 时为手指向右滚动,列表滚动显示左面的内容
dy > 0 时为手指向上滚动,列表滚动显示下面的内容
dy < 0 时为手指向下滚动,列表滚动显示上面的内容
(4)canScrollVertically和canScrollHorizontally方法
public boolean canScrollVertically (int direction)这个方法是判断View在竖直方向是否还能向上,向下滑动。其中,direction为 -1 表示手指向下滑动(屏幕向上滑动), 1 表示手指向上滑动(屏幕向下滑动)。public boolean canScrollHorizontally (int direction)这个方法用来判断 水平方向的滑动
例如:
RecyclerView.canScrollVertically(1)的值表示是否能向下滚动,false表示已经滚动到底部
RecyclerView.canScrollVertically(-1)的值表示是否能向上滚动,false表示已经滚动到顶部
(5)两种判断是否到底部的方法:
5.1方法一:
如果 当前
第一个可见item的位置 + 当前可见的item个数 >= item的总个数
这样就可以判断出来,是在底部了。
loadingMoreListener = 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); if (dy > 0) //向下滚动 { int visibleItemCount = mLinearLayoutManager.getChildCount();//得到显示屏幕内的list数量 int totalItemCount = mLinearLayoutManager.getItemCount();//得到list的总数量 int pastVisiblesItems = mLinearLayoutManager.findFirstVisibleItemPosition();//得到显示屏内的第一个list的位置数position if (!loading && (visibleItemCount + pastVisiblesItems) >= totalItemCount) { loading = true; loadMoreDate(); } } }};
通过visibleItemCount + pastVisiblesItems) >= totalItemCount
来判断是否是底部。
5.2方法二:
通过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();// }// } }};
参考:
http://blog.devwiki.net/index.php/2016/06/13/RecyclerView-Scroll-Listener.html
作者:风再起时ME
链接:http://www.jianshu.com/p/ce347cf991db
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
- RecyclerView的滚动事件OnScrollListener研究
- RecyclerView的滚动事件研究
- ListView的滚动事件onScrollListener详解
- Android 滚动事件 OnScrollListener
- Android05_下拉滚动事件OnScrollListener
- RecyclerView的滚动事件分析
- RecyclerView的滚动事件分析
- RecyclerView的滚动事件分析
- listviewd的OnScrollListener监听事件
- 通过OnScrollListener来监听RecyclerView的位置
- RecyclerView滚动事件分析
- RecyclerView滚动事件
- ListView滚动状态的监听器AbsListView.OnScrollListener
- 居中滚动的Recyclerview
- Android 关于 OnScrollListener 事件顺序次数的简要分析
- Android 关于 OnScrollListener 事件顺序次数的简要分析
- Android 关于 OnScrollListener 事件顺序次数的简要分析
- Android 关于 OnScrollListener 事件顺序次数的简要分析
- 3348-数据结构实验之数组二:稀疏矩阵
- 决策树学习笔记整理
- MySQL5.7.16安装教程,以及简单的sql命令介绍
- 组合与继承
- 调用webservice报错。
- RecyclerView的滚动事件OnScrollListener研究
- Python学习笔记(一)——编程0基础数据分析进阶之路
- [新特性]PeopleTools8.54+-PeopleSoft Application Engine新特性
- Nginx的一些基本功能
- map端join算法实现
- xml简单介绍及libmxml编程
- Redis 安装启动和密码修改
- [LintCode 389] 判断数独是否合法(Python)
- MySql insert:当通过条件查询结果存在该条数据则不插入,否则执行insert