如何获取Android RecyclerView滑动的距离
2个回答
展开全部
1. 利用OnScrollListener
[java] view plain copy
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了。
1.监听RecyclerView的addOnScrollListener后自己记录onScrolled的dy,同时给adapter加个registerAdapterDataObserver,监听插入/删除/移动,自己加减前面记录的dy滚动值。自己没有试过,不知道是否可行!
2. 有人说可以尝试computeVerticalScrollOffset()
[java] view plain copy
totalDy = recyclerView.computeVerticalScrollOffset();
然而compute方法计算出的并不是滑动的精确距离,stackOverflow上有答案解释其为 item 的平均高度 * 可见 item 数目,不是我们需要的精确距离。
3. 还有人说可以尝试getChildAt(0)
[java] view plain copy
totalDy = recyclerView.getChildAt(0).getTop();
依靠第一个item的滑动距离来进行动画的设置,但是根据该方法得出的 totalDy 在滑动到一定程度后清零。
这是因为recyclerViewl.getChildAt(0) 返回的永远是第一个可见的child,不是所有view list 的第一个child,因此这种用法是得不到滑动距离的。
另外下面这三种用法都是等价的,都是获取第一个可见的child:
[java] view plain copy
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。
[java] view plain copy
//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,强烈推荐下面的方法获取滑动距离:
[java] view plain copy
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();
}
[java] view plain copy
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了。
1.监听RecyclerView的addOnScrollListener后自己记录onScrolled的dy,同时给adapter加个registerAdapterDataObserver,监听插入/删除/移动,自己加减前面记录的dy滚动值。自己没有试过,不知道是否可行!
2. 有人说可以尝试computeVerticalScrollOffset()
[java] view plain copy
totalDy = recyclerView.computeVerticalScrollOffset();
然而compute方法计算出的并不是滑动的精确距离,stackOverflow上有答案解释其为 item 的平均高度 * 可见 item 数目,不是我们需要的精确距离。
3. 还有人说可以尝试getChildAt(0)
[java] view plain copy
totalDy = recyclerView.getChildAt(0).getTop();
依靠第一个item的滑动距离来进行动画的设置,但是根据该方法得出的 totalDy 在滑动到一定程度后清零。
这是因为recyclerViewl.getChildAt(0) 返回的永远是第一个可见的child,不是所有view list 的第一个child,因此这种用法是得不到滑动距离的。
另外下面这三种用法都是等价的,都是获取第一个可见的child:
[java] view plain copy
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。
[java] view plain copy
//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,强烈推荐下面的方法获取滑动距离:
[java] view plain copy
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();
}
2018-07-27 · 百度知道合伙人官方认证企业
育知同创教育
1【专注:Python+人工智能|Java大数据|HTML5培训】 2【免费提供名师直播课堂、公开课及视频教程】 3【地址:北京市昌平区三旗百汇物美大卖场2层,微信公众号:yuzhitc】
向TA提问
关注
展开全部
1、有两种方法:
(1)可参照:
switch (action) {
case MotionEvent.ACTION_DOWN:
DownX = event.getX();//float DownX
DownY = event.getY();//float DownY
currentMS = System.currentTimeMillis();//long currentMS 获取系统时间
break;
case MotionEvent.ACTION_MOVE:
float moveX = event.getX() - DownX;//X轴距离
float moveY = event.getY() - DownY;//y轴距离
long moveTime = System.currentTimeMillis() - currentMS搜索;//移动时间
break;
case MotionEvent.ACTION_UP:
break;}
(2)按照以下原理:
滑动其实只是不停的重绘图像,造成滑动的效果。
滑动其实是处理手的触屏事件,在自己的View里有onTouch事件,里面会MotionEvent对象,里面保存当前手的位置坐标,根据这个坐标计算手滑动的距离,一般是在收到ACTION_DOWN时保存按下的位置,然后ACTION_MOVE会不停的上报,计算得出滑动距离。
2、RecyclerView简介:
RecyclerView是v7的一个新控件。在v7.21+包中,是一个用来展示大量数据的组件,或者说,就是ListView的改善版本。RecyclerView本质上是以适配器为核心。缓存viewHolder,view包含在viewHolder内。自推出以来广受Android程序爱好者的推崇,然而不得不说这个控件存在着一个比较严重的问题,就是滑动的时候会有不可容忍的卡顿现象出现。
3、RecyclerView卡顿现象解决方法:
将耗时的操作放到recyclerview.setAdapter(adapter)之前运行,运行完后再将需要的参数传入Adapter里,此处重写一个adapter类继承Adapter就可以了。解决后运行,滑动恢复了流畅。
(1)可参照:
switch (action) {
case MotionEvent.ACTION_DOWN:
DownX = event.getX();//float DownX
DownY = event.getY();//float DownY
currentMS = System.currentTimeMillis();//long currentMS 获取系统时间
break;
case MotionEvent.ACTION_MOVE:
float moveX = event.getX() - DownX;//X轴距离
float moveY = event.getY() - DownY;//y轴距离
long moveTime = System.currentTimeMillis() - currentMS搜索;//移动时间
break;
case MotionEvent.ACTION_UP:
break;}
(2)按照以下原理:
滑动其实只是不停的重绘图像,造成滑动的效果。
滑动其实是处理手的触屏事件,在自己的View里有onTouch事件,里面会MotionEvent对象,里面保存当前手的位置坐标,根据这个坐标计算手滑动的距离,一般是在收到ACTION_DOWN时保存按下的位置,然后ACTION_MOVE会不停的上报,计算得出滑动距离。
2、RecyclerView简介:
RecyclerView是v7的一个新控件。在v7.21+包中,是一个用来展示大量数据的组件,或者说,就是ListView的改善版本。RecyclerView本质上是以适配器为核心。缓存viewHolder,view包含在viewHolder内。自推出以来广受Android程序爱好者的推崇,然而不得不说这个控件存在着一个比较严重的问题,就是滑动的时候会有不可容忍的卡顿现象出现。
3、RecyclerView卡顿现象解决方法:
将耗时的操作放到recyclerview.setAdapter(adapter)之前运行,运行完后再将需要的参数传入Adapter里,此处重写一个adapter类继承Adapter就可以了。解决后运行,滑动恢复了流畅。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询