RecyclerView smoothScrollToPosition的滚动时间
来源:互联网 发布:接入网的用户网络接口 编辑:程序博客网 时间:2024/05/03 23:10
当RecyclerView中的数据集很大时,通过smoothScrollToPosition
去滚动到一个位置,如果这个位置和当前位置相差很远,比如说300项,你会发现整个过程很长,比如说我遇到的,滚动300项,用了3.5秒。
这主要跟RecyclerView smoothScroll的方式有关,它内部有一个常量值代表每滚动1px需要多少时间,所以滚动的距离越远,需要的时间越长。所以当真的需要滚动很多项时,有时看着真心蛋疼,所以就想看看怎么改一下。
看下LinearLayoutmanager.smoothScrollToPosition
:
1234567891011121314
@Overridepublic void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state, int position) { LinearSmoothScroller linearSmoothScroller = new LinearSmoothScroller(recyclerView.getContext()) { @Override public PointF computeScrollVectorForPosition(int targetPosition) { return LinearLayoutManager.this .computeScrollVectorForPosition(targetPosition); } }; linearSmoothScroller.setTargetPosition(position); startSmoothScroll(linearSmoothScroller);}
内部是实例化了一个LinearSmoothScroller的实例来处理Scroll事件的,我们自字义一个LinearSmoothScroller应该就能自定义Smooth事件,上面的computeScrollVectorForPosition
方法不用管,直接复制过来就行了,因为LinearSmoothScroller
是抽象类,这个方法必须实现。
然后看下LinearSmoothScroller
的方法,发现一个方法叫protected int calculateTimeForScrolling(int dx)
,看这名字就知道函数的作用了,直接重写这个函数,让它最多返回1500:
1234
@Overrideprotected int calculateTimeForScrolling(int dx) { return Math.min(1500, super.calculateTimeForScrolling(dx));}
但是,实际滚动时间更长了。。打Log,把每次返回值和dx的值都打印出来,然后继续测试,然后发现这个函数不是计算这一个smoothScrollToPosition
需要的时间的,实际情况时,当实际需要滚动的距离大于10000时,滚动会分多次进行,比如说滚动52000距离,实际会这个函数会调用6次,dx的值前5次是10000,最后一次是2000。实际滚动时间是这6次返回值的和。
知道了这个,解决也简单了,它想分多次调用就让它多次调用吧,我只要每次返回的时间值很小就行了。方法有两个。
- 直接修改返回值,让它足够小
- 修改传入的参数,当dx足够小时,计算出的时间自然就小了。
我决定采用第二种方法,当滚动距离比较小时不会造成影响,完整代码如下:
12345678910111213141516171819202122232425262728
mLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false) { @Override public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state, int position) { LinearSmoothScroller linearSmoothScroller = new LinearSmoothScroller(recyclerView.getContext()) { @Override protected int calculateTimeForScrolling(int dx) { // 此函数计算滚动dx的距离需要多久,当要滚动的距离很大时,比如说52000, // 经测试,系统会多次调用此函数,每10000距离调一次,所以总的滚动时间 // 是多次调用此函数返回的时间的和,所以修改每次调用该函数时返回的时间的 // 大小就可以影响滚动需要的总时间,可以直接修改些函数的返回值,也可以修改 // dx的值,这里暂定使用后者. // (See LinearSmoothScroller.TARGET_SEEK_SCROLL_DISTANCE_PX) if (dx > 3000) { dx = 3000; } return super.calculateTimeForScrolling(dx); } @Override public PointF computeScrollVectorForPosition(int targetPosition) { return mLayoutManager.computeScrollVectorForPosition(targetPosition); } }; linearSmoothScroller.setTargetPosition(position); startSmoothScroll(linearSmoothScroller); }};
原文链接:http://www.angeldevil.me/2015/09/08/The-smoothScrollToPosition-duration-of-RecyclerView/
- RecyclerView smoothScrollToPosition的滚动时间
- Android RecyclerView.smoothScrollToPosition()的实现
- RecyclerView调用smoothScrollToPosition() 控制滑动速度
- 居中滚动的Recyclerview
- smoothScrollToPositionFromTop和smoothScrollToPosition的区别
- RecyclerView通过manager.smoothScrollToPosition()来改变滑动速度
- RecyclerView的滚动事件分析
- RecyclerView的滚动事件研究
- RecyclerView的滚动事件分析
- 强大的滚动控件RecyclerView
- RecyclerView的滚动事件分析
- android listview中smoothscrolltoposition的问题
- 完美解决smoothScrollToPosition(0)失效的问题
- 解决ListView的smoothScrollToPosition不精确问题
- RecyclerView 滚动
- 具有回弹效果的RecyclerView,RecyclerView外层可滚动容器
- RecyclerView -- 更强大的滚动控件1
- RecyclerView--更强大的滚动控件2
- iOS9新特性
- java并发之Lock
- 使用Eclipse的Generator MyBatis/iBatis Artifacts插件自动生成代码,与spring集成
- 南京理工大学第八届程序设计大赛-sequence
- iOS6的旋屏控制技巧(单独控制某个UIViewController的旋屏方向支持)
- RecyclerView smoothScrollToPosition的滚动时间
- JavaScript之新手入门数组篇
- 2.1 使用意图链接活动
- poj3176——Cow Bowling(dp)
- 关于null类
- UIButton无法响应点击事件问题
- iOS 天气应用代码中文介绍
- 南京理工大学第八届程序设计大赛-琪露诺的算术教室
- HDU 1571 下沙小面的(1)