關(guān)于平滑锣杂,其實(shí)listview可以直接通過調(diào)用這個(gè)方法
smoothScrollToPosition(int position)
Smoothly scroll to the specified adapter position. // 滑動到適配器指定位置
Recycleview對于平滑 楔敌,也提供了兩種方法:
recycleview.smoothScrollBy();//需要提供滑動的距離
recycleview.smoothScrollToPosition();//這個(gè)方法只保證指定的item被滑動到屏幕中尊惰,意味著自下往上滑的話碳却,可以將指定item置頂,但是如果已經(jīng)在屏幕中的話,那他就不會起作用伪阶,并且如果是自上往下滑的話截亦,則置頂?shù)膇tem就會被滑到底部
當(dāng)然政供,如果沒有平滑的需求伙判,可以直接調(diào)用:
recycleview.scrollToPosition();//沒有任何效果的移動到指定position
因?yàn)閞ecycleview沒有提供一步到位的方法迈嘹,只能自己去實(shí)踐了鸟蟹,發(fā)現(xiàn)通過上面兩種方法交替使用蜕提,就可以達(dá)到我們想要的效果了森书,直接上關(guān)鍵代碼:
public void scollToPosition(int n) {
//滑動到指定的item
this.index = n ;//記錄一下 在第三種情況下會用到
//拿到當(dāng)前屏幕可見的第一個(gè)position跟最后一個(gè)postion
int firstItem = manager.findFirstVisibleItemPosition();
int lastItem = manager.findLastVisibleItemPosition();
//區(qū)分情況
if (n <= firstItem ){
//當(dāng)要置頂?shù)捻?xiàng)在當(dāng)前顯示的第一個(gè)項(xiàng)的前面時(shí)
recycleview.smoothScrollToPosition(n);
}else if ( n <= lastItem ){
//當(dāng)要置頂?shù)捻?xiàng)已經(jīng)在屏幕上顯示時(shí)
int top = recycleview.getChildAt(n - firstItem).getTop();
recycleview.smoothScrollBy(0,top);
}else{
//當(dāng)要置頂?shù)捻?xiàng)在當(dāng)前顯示的最后一項(xiàng)的后面時(shí)
recycleview.smoothScrollToPosition(n);
//這里這個(gè)變量是用在RecyclerView滾動監(jiān)聽里面的
move = true;
}
}
判斷三種情況,如果是第一種情況的下谎势,直接調(diào)用smoothScrollToPosition即可凛膏,順利平滑。如果是第二種情況脏榆,要滑動的item已經(jīng)是在屏幕中了 译柏,調(diào)用smoothScrollToPosition不會起到任何作用,這個(gè)時(shí)候手動的去判斷一下要滑動的距離即可姐霍。至于第三種情況就需要先用smoothScrollToPosition鄙麦,讓item滑動到屏幕中,再在recycleview的滑動監(jiān)聽中镊折,去做后面一部分的平滑:
//監(jiān)聽recycleview的滑動
recyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
//在這里進(jìn)行第二次滾動
if (move ){
move = false;
//獲取要置頂?shù)捻?xiàng)在當(dāng)前屏幕的位置胯府,mIndex是記錄的要置頂項(xiàng)在RecyclerView中的位置
int n = index - manager.findFirstVisibleItemPosition();
if ( 0 <= n && n < recyclerView.getChildCount()){
//獲取要置頂?shù)捻?xiàng)頂部離RecyclerView頂部的距離
int top = recyclerView.getChildAt(n).getTop();
//最后的移動
recyclerView.smoothScrollBy(0, top);
}
}
}
});
就這樣,recycleview可以做到如listview一樣恨胚,完美平滑了骂因。