RecyclerView 给我们的可以检测滑动事件的接口 只有 一个方法

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)的更多相关文章

  1. NestedScrollView嵌套RecycleView 滑动 实现上滑隐藏 下滑显示头部效果

    废了好大的劲才弄好的,记下来 方便以后查看 public class MainActivity extends AppCompatActivity { private RecyclerView mRe ...

  2. js判断手指的上滑,下滑,左滑,右滑,事件监听

    原理:1:当开始一个touchstart事件的时候,获取此刻手指的横坐标startX和staerY: 2:当触发touchmove事件的时候,再获取此时手指的横坐标moveEndX和纵坐标moveEn ...

  3. vue中使用触摸事件,上滑,下滑,等

    第一步,下载一个包 npm install kim-vue-touch -s 在当前项目中下载包 第二部 import vueTouch from 'kim-vue-touch' Vue.use(vu ...

  4. js监听事件 上滑消失下滑出现的效果 触摸与手势事件

    https://www.w3cmm.com/javascript/touch.html //触摸与手势事件连接tinyscrollbar //方法1var _this = $('#fabu');var ...

  5. vue js判断长按触发及手指的上滑、下滑、左滑、又滑

    <span class="btn" @touchstart="touchstart()" @touchmove="touchmove()&quo ...

  6. 判断listview是上滑还是下滑的方法

    方法一: 用setOnScrollListener(new AbsListView.OnScrollListener())来实现,判断滑动后显示的第一个条目 ,与滑动前的第一个条目的大小来判断, 这种 ...

  7. touch监听判断手指的上滑,下滑,左滑,右滑,事件监听

    判断滑动的方向和距离,来实现一定的效果,比如返回上一页等等 <body> <script> $(function(){ //给body强制定义高度 var windowHeig ...

  8. iOS 上滑隐藏导航,下滑显示导航,仿斗鱼导航效果

    UItableView或 UIcollectionView 都是继承UIScrollView 滑动的时候,判断是上滑还是下滑 使用 UIScrollView 的代理方法 func scrollView ...

  9. uwp - 上滑隐藏导航栏下滑显示

    原文:uwp - 上滑隐藏导航栏下滑显示 好久没写博客了,因为忙着工作.昨天周末填坑需要做一个上滑列表数据时隐藏导航栏下滑时显示的效果,下面分享一下我的做法,希望能给你带来帮助. 思路是通过判断滚动条 ...

随机推荐

  1. 003-常用的Meta标签写法和作用

    页面关键词<meta name="keywords" content="your,tags"/> 页面描述<meta name="d ...

  2. Media Queries使用方法

    1. 最大宽度max-width “max-width”是媒体特性中最常用的一个特性,其意思是指媒体类型小于或等于指定的宽度时,样式生效.如: @media screen and (max-width ...

  3. Java高效编程之四【C语言结构的替代】

    本章节可以跳过,但是[二十一]是非常有价值的 十九.用类代替结构 坚持以包含私有域和公有访问方法(accessor method)的类.Java平台中有几个类违反了“公有类不应该直接暴露数据域”的告诫 ...

  4. YbSoftwareFactory 代码生成插件【二十】:DynamicObject的序列化

    DynamicObject 是 .NET 4.0以来才支持的一个类,但该类在.NET 4.0下未被标记为[Serializable] Attribute,而在.NET 4.5下则被标记了[Serial ...

  5. php 中文繁简体转换

    <?php $testC = new TestC (); $testC->index (); class TestC { private $utf8_gb2312; private $ut ...

  6. 《编写可维护的JavaScript》——JavaScript编码规范(三)

    啦啦啦啦啦,今天第二篇随笔\(^o^)/~ ////////////////////////////////正文分割线////////////////////////////////////// 直接 ...

  7. mysql基本语句

    mysql -u root -p; 登录数据库 show databases; 展示数据库 show tables; 展示表 desc messages; 查看messages表的结构 drop da ...

  8. CSS 的overflowhidden 属性详细解释

    overflow:hidden这个CSS样式是大家常用到的CSS样式,但是大多数人对这个样式的理解仅仅局限于隐藏溢出,而对于清除浮动这个含义不是很了解.      一提到清除浮动,我们就会想到另外一个 ...

  9. 在现有的图像处理软件中融合dxf格式输出

    在现有的图像处理软件中融合dxf格式输出 dxf格式是autocade的支持格式.如果将现有图像识别的结果导出到dxf格式,就能够使用autocad的强大功能进行后续处理. dxf的格式比较复杂,开源 ...

  10. JS跨域

    //2011-7-25 (function(){ //闭包 function load_script(xyUrl, callback){ var head = document.getElements ...