卧疾丰暇豫,翰墨时间作。这篇文章主要讲述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滚动值。自己没有试过,不知道是否可行!
totalDy = recyclerView.computeVerticalScrollOffset();
然而compute方法计算出的并不是滑动的精确距离,stackOverflow上有答案解释其为 item 的平均高度 * 可见 item 数目,不是我们需要的精确距离。
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(); }
【Android 如何获取Android RecyclerView滑动的距离】
推荐阅读
- Android 通过OnScrollListener来监听RecyclerView的位置
- 转载-android studio 各种问题
- GHO文件 雨林木风Win10系统下载2016年11月出品
- Win10 64位番茄花园系统下载
- 最新电脑公司Win10 64位专业装机版下载
- 系统之家Microsoft Win10 64位专业版推荐
- Win10专业版下有哪些装机必备的软件?
- Win10系统里玩LOL黑屏修好补丁应用
- Win10专业版下微软拼音如何自概念词库?