zoukankan      html  css  js  c++  java
  • Android 如何获取Android RecyclerView滑动的距离

    如何获取 RecyclerView 的滑动距离?

    RecyclerView 虽然有getScrollX() 和 getScrollY(), 但是测试发现这两个函数总是返回0,太无语了。因此想到了下面几种方法来实现获取滑动距离:

    1.  利用OnScrollListener

            mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
                private int totalDy = 0;
                @Override
                public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                    totalDy -= dy;
                }
            });

    如代码所述,totalDy的确保存了 RecyclerView 的滑动距离,但是当我向下滑动 RecyclerView ,之后插入/删除/移动 Item 的时候,totalDy 就变得不精确了;比如删除或者插入新的Item,那么totalDy就不能再回归到 0了。

    解决办法:监听RecyclerView的addOnScrollListener后自己记录onScrolled的dy,同时给adapter加个registerAdapterDataObserver,监听插入/删除/移动,自己加减前面记录的dy滚动值。自己没有试过,不知道是否可行!

    2. 有人说可以尝试computeVerticalScrollOffset()

    totalDy = recyclerView.computeVerticalScrollOffset();

    然而compute方法计算出的并不是滑动的精确距离,stackOverflow上有答案解释其为 item 的平均高度 * 可见 item 数目,不是我们需要的精确距离。

    3. 还有人说可以尝试getChildAt(0) 

    totalDy = recyclerView.getChildAt(0).getTop();

    依靠第一个item的滑动距离来进行动画的设置,但是根据该方法得出的 totalDy 在滑动到一定程度后清零。

    这是因为recyclerViewl.getChildAt(0) 返回的永远是第一个可见的child,不是所有view list 的第一个child,因此这种用法是得不到滑动距离的。

    另外下面这三种用法都是等价的,都是获取第一个可见的child:

           LinearLayoutManager layoutManager = (LinearLayoutManager) this.getLayoutManager();
           View firstVisiableChildView = this.getChildAt(0);
           View firstVisiableChildView = layoutManager.getChildAt(0)
           int position = layoutManager.findFirstVisibleItemPosition();
           View firstVisiableChildView = layoutManager.getChildAt(position)

    但是下面这种就不是获取第一个可见的child,而是获得所有view list 的第一个child。但是滑动一段距离后它总是返回null,即第一个child被recycle后,总是返回null。

    //Don't use this function to get the first item, it will return null when the first item is recycled. 
    LinearLayoutManager layoutManager = (LinearLayoutManager) this.getLayoutManager();
    View child2 = layoutManager.findViewByPosition(0);

    4.如果LayoutManager用的是LinearLayoutManager,强烈推荐下面的方法获取滑动距离:

       public int getScollYDistance() {
           LinearLayoutManager layoutManager = (LinearLayoutManager) this.getLayoutManager();
           int position = layoutManager.findFirstVisibleItemPosition();
           View firstVisiableChildView = layoutManager.findViewByPosition(position);
           int itemHeight = firstVisiableChildView.getHeight();
           return (position) * itemHeight - firstVisiableChildView.getTop();
       }
  • 相关阅读:
    打印二叉树和为某一值的路径
    顺时针打印数组
    算术表达式
    堆内存与栈内存详解
    【腾讯校招在线考试附加题】将一个10进制数转换为四位定长的36进制数
    反转链表
    记录github出错及解决方案
    centos7操作防火墙
    无法在web.xml或使用此应用程序部署的jar文件中解析绝对uri:[http://java.sun.com/jsp/jstl/core]解决方法
    MyBatis联表查询——别名方式
  • 原文地址:https://www.cnblogs.com/zhujiabin/p/7204050.html
Copyright © 2011-2022 走看看