RecyclerView 滑动检测 (上滑 up)(下滑 down)(顶部 top)(底部 bottom)
recyclerview.setOnScrollListener()或者 recyclerview.addOnScrollListener() set方法将会被弃用 deprecated 最好使用add方法但是这个也可以根据自己情况,如果自己当前的api中set方法没有被弃用,不存在add方法。就只能使用set方法了。
监听 上滑,下滑
这些都不是重点,接下来就分析如何监听,RecyclerView的滑动。
RecyclerView.OnScrollListener中有一个方法 叫 onScrolled()
public void onScrolled(RecyclerView recyclerView, int dx, int dy){}
其中dx,dy分别表示 在x方向和y方向滑动的值,这个值有正负。
如果 dx>0 则表示 右滑 , dx<0 表示 左滑 dy <0 表示 上滑, dy>0 表示下滑
通过这几个参数就可以监听 滑动方向的状态。
监听 顶部,底部
但是还有两种情况,不能通过 dx,dy直接判断出来。那就是 顶部 top状态,底部 bottom状态。需要借助一些其他参数,结合来判断。
第一种方法
第一种方法,在ListView中也经常使用,就是 firstvisibleItem , visibleItemCount,totalItemCount。 也就是 当前屏幕 首个 可见的 Item 的position,当前屏幕 可见的 Item 个数,Item总共的个数。
private boolean loading = true;
int pastVisiblesItems, visibleItemCount, totalItemCount;
mRecyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
visibleItemCount = mLayoutManager.getChildCount();
totalItemCount = mLayoutManager.getItemCount();
pastVisiblesItems = mLayoutManager.findFirstVisibleItemPosition();
if (loading) {
if ( (visibleItemCount + pastVisiblesItems) >= totalItemCount) {
// 判断点
loading = false;
Log.v("...", "Last Item Wow !");
}
}
}
});
判断的依据就在 代码注释的地方,通过比较上面三个参数来判断
如果 当前 第一个可见item的位置+ 当前可见的item个数 >= item的总个数 这样就可以判断出来,是在底部了,bottom。
同理,可以通过第一个可见的item的位置来判断 是否在 顶部 top。
loading只是一个flag 用来避免重复加载。
第二种方法
通过View的滑动属性来判断,是否在顶部,或者底部。这种方法的实现非常简便。
通过重写 OnScrollListener来判断。
public abstract class OnVerticalScrollListener
extends RecyclerView.OnScrollListener {
@Override
public final void onScrolled(RecyclerView recyclerView, int dx, int dy) {
if (!recyclerView.canScrollVertically(-1)) {
onScrolledToTop();
} else if (!recyclerView.canScrollVertically(1)) {
onScrolledToBottom();
} else if (dy < 0) {
onScrolledUp();
} else if (dy > 0) {
onScrolledDown();
}
}
public void onScrolledUp() {}
public void onScrolledDown() {}
public void onScrolledToTop() {}
public void onScrolledToBottom() {}
}
这个方法利用了View的一个方法。public boolean canScrollVertically (int direction)
这个方法是判断View在竖直方向是否还能 向上,向下 滑动。
根据上面的例子,应该可以看出。 -1 表示 向上, 1 表示向下。
同理还有 public boolean canScrollHorizontally (int direction) 方法用来判断 水平方向的滑动。 具体的使用方法可以参考 官方文档
实现这个自定义的Listener之后你就可以在RecycyclerView的setOnScrollListener方法中使用了,像系统的使用方法一样。
RecyclerView 滑动检测 (上滑 up)(下滑 down)(顶部 top)(底部 bottom)的更多相关文章
- NestedScrollView嵌套RecycleView 滑动 实现上滑隐藏 下滑显示头部效果
废了好大的劲才弄好的,记下来 方便以后查看 public class MainActivity extends AppCompatActivity { private RecyclerView mRe ...
- js判断手指的上滑,下滑,左滑,右滑,事件监听
原理:1:当开始一个touchstart事件的时候,获取此刻手指的横坐标startX和staerY: 2:当触发touchmove事件的时候,再获取此时手指的横坐标moveEndX和纵坐标moveEn ...
- vue中使用触摸事件,上滑,下滑,等
第一步,下载一个包 npm install kim-vue-touch -s 在当前项目中下载包 第二部 import vueTouch from 'kim-vue-touch' Vue.use(vu ...
- js监听事件 上滑消失下滑出现的效果 触摸与手势事件
https://www.w3cmm.com/javascript/touch.html //触摸与手势事件连接tinyscrollbar //方法1var _this = $('#fabu');var ...
- vue js判断长按触发及手指的上滑、下滑、左滑、又滑
<span class="btn" @touchstart="touchstart()" @touchmove="touchmove()&quo ...
- 判断listview是上滑还是下滑的方法
方法一: 用setOnScrollListener(new AbsListView.OnScrollListener())来实现,判断滑动后显示的第一个条目 ,与滑动前的第一个条目的大小来判断, 这种 ...
- touch监听判断手指的上滑,下滑,左滑,右滑,事件监听
判断滑动的方向和距离,来实现一定的效果,比如返回上一页等等 <body> <script> $(function(){ //给body强制定义高度 var windowHeig ...
- iOS 上滑隐藏导航,下滑显示导航,仿斗鱼导航效果
UItableView或 UIcollectionView 都是继承UIScrollView 滑动的时候,判断是上滑还是下滑 使用 UIScrollView 的代理方法 func scrollView ...
- uwp - 上滑隐藏导航栏下滑显示
原文:uwp - 上滑隐藏导航栏下滑显示 好久没写博客了,因为忙着工作.昨天周末填坑需要做一个上滑列表数据时隐藏导航栏下滑时显示的效果,下面分享一下我的做法,希望能给你带来帮助. 思路是通过判断滚动条 ...
随机推荐
- 浅谈JDBC编程
一.概述 1.为什么要用JDBC 数据库是程序不可或缺的一部分,每一个网站和服务器的建设都需要数据库.对于大多数应用程序员(此处不包含数据库开发人员)来说,我们更多的不是在DBMS中对数据库进行操纵, ...
- jquery 通过ajax FormData 对象上传附件
之前上传附件都是用插件,或者用form表单体检(这个是很久以前的方式了),今天突发奇想,自己来实现附件上传,具体实现如下 html: <div> 流程图: <input id=& ...
- [整理]Centos6.5 + hadoop2.6.4环境搭建
搭建Hadoop集群环境(3台机器) 1 准备环境 1.1 安装系统,并配置网络使3台机器互联互通,且SSH可直连(无需密码.保存私钥) 1.1.1 安装系统 安装Centos 6.5系统 安装过程略 ...
- LDD3 字符设备驱动简单分析
最近在看LDD3,理解了一下,为了加深自己的印象,自己梳理一下.我用的CentOS release 6.6 (Final)系统. 一.编写编译内核模块的Makefile 以下是我用的Makefile ...
- C++多级指针与多维数组详细介绍
多级指针的概念 多级指针可对应于多维数组,这种指针变量中存的是另一个指针变量的地址,其说明如下: int val=10; int *ptr=&val; int **pptr= ...
- EditPlus 3.7 中文版已经发布
新一版的 EditPlus 已经在昨天发布了!新版本增加了一个 64位版程序.大家可以到官方网站下载哦. 我同步更新翻译了 32位版应用程序.请点击页面左上角的链接下载.
- VS2015 VisualStudio Emulator for Android 模拟器目录
C:\Users\wangbin5542\AppData\Local\Microsoft\VisualStudioEmulator\Android\Containers\Local\Devices 目 ...
- 使用FastJSON,将对象或数组和JSON串互转
Fastjson,是阿里巴巴提供的一个Java语言编写的高性能功能完善的JSON库.其开源的下载网址为:https://github.com/AlibabaTech/fastjson. 示例代码如下: ...
- A ship is always safe at the shore - but that is not what it is built for.
A ship is always safe at the shore - but that is not what it is built for. 船靠岸边总是安全的,但那不是建造它的目的.
- 一个ubuntu phper的自我修养(atom)
将atom打造成二十一世纪最装那啥的php IDE 之前在windows平台使用的php IDE一直是eclipse for php,因为之前做java开发,所以对eclipse很有感情,debug. ...