RecyclerView提供的用于控制移動的常用方法有3個 :
- smoothScrollToPosition(int)
- scrollToPosition(int)
- scrollBy(int x,int y)
1.smoothScrollToPosition
該方法是平滑滾動,是可以看到item在屏幕滾動的狀態(tài)真竖。但是用于RecyclerView大量數(shù)據(jù)不理想捌省,看源碼:
public void smoothScrollToPosition(int position) {
// ···省略無關(guān)代碼,mLayout是該RecyclerView的LayoutManager對象
mLayout.smoothScrollToPosition(this, mState, position);
}
所以實際上是調(diào)用RecyclerView.LayoutManager.smoothScrollToPosition()方法,這是個抽象方法漏益。由于筆者項目中是LinearLayoutManager于是找到其具體實現(xiàn)如下
@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看看。重大發(fā)現(xiàn)—里面有一個跟滑動速度相關(guān)的函數(shù):
/**
* Calculates the scroll speed.
* 計算滑動速度
* 返回:滑過1px所需的時間消耗飘言。
*/
protected float calculateSpeedPerPixel(DisplayMetrics displayMetrics) {
// MILLISECONDS_PER_INCH是常量衣形,等于20f
return MILLISECONDS_PER_INCH / displayMetrics.densityDpi;
}
從源碼可以看出smoothScrollToPosition方法滾動每條都需要一定的時間,所以如果滾動的條目太多姿鸿,屏幕會顯示一直在滾動谆吴;
2.scrollToPosition
無滑動效果,這個方法的作用是顯示指定項苛预,就是把你想置頂?shù)捻楋@示出來句狼,但是在屏幕的什么位置是不管的,只要那一項現(xiàn)在看得到了热某,那它就罷工了腻菇!如果需要指定的條目滾動到頂部位置,可以查考如下代碼:
mRecycleview.scrollToPosition(position);
LinearLayoutManager mLayoutManager = (LinearLayoutManager) mRecycleview.getLayoutManager();
mLayoutManager.scrollToPositionWithOffset(position, 0);
3.scrollBy
這個方法是自己去控制移動的距離昔馋,單位應(yīng)該是像素筹吐。