RecyclerView提供的用于控制移动的常用方法有3个 :
- smoothScrollToPosition(int)
- scrollToPosition(int)
- scrollBy(int x,int y)
1.smoothScrollToPosition
该方法是平滑滚动,是可以看到item在屏幕滚动的状态。但是用于RecyclerView大量数据不理想,看源码:
public void smoothScrollToPosition(int position) {
// ···省略无关代码,mLayout是该RecyclerView的LayoutManager对象
mLayout.smoothScrollToPosition(this, mState, position);
}
所以实际上是调用RecyclerView.LayoutManager.smoothScrollToPosition()方法,这是个抽象方法。由于笔者项目中是LinearLayoutManager于是找到其具体实现如下
@Override
public void smoothScrollToPosition(RecyclerView recyclerView,
RecyclerView.State state, final int position) {
LinearSmoothScroller smoothScroller = new LinearSmoothScroller(context);
smoothScroller.setTargetPosition(position);
startSmoothScroll(smoothScroller);
}
生成一个RecyclerView.SmoothScroller的子类LinearSmoothScroller对象smoothScroller,接着利用smoothScroller去完成剩下的滑动工作。
看到这里很失望,没看到有效信息,于是进去LinearSmoothScroller看看。重大发现—里面有一个跟滑动速度相关的函数:
/**
* Calculates the scroll speed.
* 计算滑动速度
* 返回:滑过1px所需的时间消耗。
*/
protected float calculateSpeedPerPixel(DisplayMetrics displayMetrics) {
// MILLISECONDS_PER_INCH是常量,等于20f
return MILLISECONDS_PER_INCH / displayMetrics.densityDpi;
}
从源码可以看出smoothScrollToPosition方法滚动每条都需要一定的时间,所以如果滚动的条目太多,屏幕会显示一直在滚动;
2.scrollToPosition
无滑动效果,这个方法的作用是显示指定项,就是把你想置顶的项显示出来,但是在屏幕的什么位置是不管的,只要那一项现在看得到了,那它就罢工了!如果需要指定的条目滚动到顶部位置,可以查考如下代码:
mRecycleview.scrollToPosition(position);
LinearLayoutManager mLayoutManager = (LinearLayoutManager) mRecycleview.getLayoutManager();
mLayoutManager.scrollToPositionWithOffset(position, 0);
3.scrollBy
这个方法是自己去控制移动的距离,单位应该是像素。