zoukankan      html  css  js  c++  java
  • 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方法中使用了,像系统的使用方法一样。

    参考链接

     
  • 相关阅读:
    当spark遇见hbase
    激活函数
    scala的插值器
    sql语句基础
    机器学习中的归一化方法
    sklearn的使用
    sonarqube报错Cause: java.sql.BatchUpdateException: Incorrect string value: 'xF2xB4xB0xBFxDAxBE...' for column 'message' at row 38
    soanrqube 语言插件下载
    sonarqube扫描报错:Caused by: com.mysql.jdbc.PacketTooBigException: Packet for query is too large (4522715 > 4194304). You can change this value on the server by setting the max_allowed_packet' variable.
    xcode11 xcrun altool 自动上传ipa到app store 报错A Distribution Provisioning profile should be used when submitting apps to the App Store. For more information
  • 原文地址:https://www.cnblogs.com/xgjblog/p/6183941.html
Copyright © 2011-2022 走看看