RecyclerView 滑动检测 (上滑 up)(下滑 down)(顶部 top)(底部 bottom)

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方法中使用了,像系统的使用方法一样。

参考链接

时间: 2024-12-21 09:23:58

RecyclerView 滑动检测 (上滑 up)(下滑 down)(顶部 top)(底部 bottom)的相关文章

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

废了好大的劲才弄好的,记下来 方便以后查看 public class MainActivity extends AppCompatActivity { private RecyclerView mRecyclerView; private List<String> mDatas; private HomeAdapter mAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(

聊天软件中的窗口上滑和下滑提示上下线

聊天软件中右下角窗口上滑提示有好友上线,窗口下滑提示有好友下线. 在 Qt 下实现此功能,用到的类有 QPoint  QTimer mainwindow.h 1 #ifndef MAINWINDOW_H 2 #define MAINWINDOW_H 3 4 #include <QMainWindow> 5 #include <QPoint> 6 #include <QTimer> 7 8 namespace Ui { 9 class MainWindow; 10 } 1

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

第一步,下载一个包 npm install kim-vue-touch -s 在当前项目中下载包 第二部 import vueTouch from 'kim-vue-touch' Vue.use(vueTouch) kim-vue-touch提供了点击.长按.左滑.右滑.上滑.下滑等事件, 当你不需要传参时可以通过v-tap="vueTouch"的形式调用方法, 当你需要传参时v-tap="(e)=>vueTouch('点击',e)"的方式调用,e是event

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

方法一: 用setOnScrollListener(new AbsListView.OnScrollListener())来实现,判断滑动后显示的第一个条目 ,与滑动前的第一个条目的大小来判断, 这种方法逻辑简单,但是必须要滑动到当前第一条目隐藏后才能起作用,当listview的单个条目的高度很大时,这种方法就不好使了.代码如下: lv_shiti_content.setOnScrollListener(new AbsListView.OnScrollListener() { boolean s

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

判断滑动的方向和距离,来实现一定的效果,比如返回上一页等等 <body> <script> $(function(){ //给body强制定义高度 var windowHeight = $(window).height(), $body = $("body"); // console.log($(window).height()); //627 // console.log($('body').height()); //0 $body.css("hei

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

UItableView或 UIcollectionView 都是继承UIScrollView 滑动的时候,判断是上滑还是下滑 使用 UIScrollView 的代理方法 p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #000000 } span.s1 { color: #ba2da2 } span.s2 { } span.s3 { color: #703daa } func scrollViewWillEnd

微信 判断 上滑 下滑 操作

1:判断用户动作,"向上滑动" 或者 "向下滑动",闲话不多说,直接上代码: 方法1 ( 利用 bindtouchmove,缺点:可能会频繁操作 setData 方法 ) : <view wx:for="{{list}}" id="{{item}}" wx:key="{{index}}" bindtouchmove="checktouchmove" class="know

微信小程序监听用户上滑下滑事件

今天做了一个要根据用户上滑或者下滑来显示不同内容的功能. 思路:先监听用户是上滑还是下滑,监听到结果后改变data数据中用来判断模块显示隐藏的变量,两个需要切换的模块使用两个hidden,data中定义两个变量来接受更改后的true或者false 页面 hidden='{{bottom}}' hidden='{{top}}' data{ //初始化状态 top:true, bottom:false, } //判断浏览器滚动条上下滚动 if (t.scrollTop > a.data.scroll

Android 上滑显示底部导航,下滑显示标题bar

本文简单介绍使用属性动画来实现上滑显示底部导航,下滑显示标题bar.先上图看效果,再分析: 可以看出这是个listview有标题和底部,有点像下拉刷新和上拉加载更多.只不过下拉或上拉一定时位置固定拉不动,且只在list的第一个item出现显示时,才平滑动画的让标题或底部显示或隐藏. 实现思路: 1.整个布局有三个部分构成,上部由一个RelativeLayout放ImageView或TextView.中间部分是个listView,下部是一个TextView. 2.采用LinearLayout摆放中