RecyclerView滾動到指定位置的一種姿勢。

其實這個問題沒有什么難度了,下面的兩種方式都可以實現(xiàn),但是效果可能并不是我想要的。

recyclerView.scrollToPosition(position);
recyclerView.smoothScrollToPosition(position);

因為我的效果是想要指定的position滑動到窗口最頂部,但實際效果卻不是這樣的。

百度

老規(guī)度,借助一下性無能的百度。
答案出來了:


  /**
     * RecyclerView 移動到當前位置,
     *
     * @param manager  設(shè)置RecyclerView對應(yīng)的manager
     * @param n  要跳轉(zhuǎn)的位置
     */
    public static void MoveToPosition(LinearLayoutManager manager, int n) {
        manager.scrollToPositionWithOffset(n, 0);
        manager.setStackFromEnd(true);
    }

也有這樣的:

final LinearLayoutManager manager = (LinearLayoutManager) recyclerView.getLayoutManager();
int fir = manager.findFirstVisibleItemPosition();
int end = manager.findLastVisibleItemPosition();
final int p = Integer.parseInt(string);
if (p <= fir) {
      recyclerView.scrollToPosition(p);
} else if (p <= end) {   
    int top = recyclerView.getChildAt(p - fir).getTop(); 
    recyclerView.scrollBy(0, top);
} else {    
    recyclerView.scrollToPosition(p);    //先讓當前view滾動到列表內(nèi)
    move = true;
}
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener()
{    
    @Override  
      public void onScrolled(RecyclerView recyclerView, int dx, int dy) { 
        super.onScrolled(recyclerView, dx, dy);  
              if (move) {          
            move = false;     
         int n = p - manager.findFirstVisibleItemPosition(); 
if (n >= 0 && n < recyclerView.getChildCount()) {    
          recyclerView.scrollBy(0, recyclerView.getChildAt(n).getTop()); //滾動到頂部
      }    
  } 
 }
});

這個代碼很多了,看看腦袋都大嘍。

我的方法

    LinearSmoothScroller smoothScroller = new LinearSmoothScroller(this){

        @Override
        protected int getVerticalSnapPreference() {
            return LinearSmoothScroller.SNAP_TO_START;
        }
    };
    smoothScroller.setTargetPosition(0);
    recyclerView.getLayoutManager().startSmoothScroll(smoothScroller);

關(guān)鍵在于 getVerticalSnapPreference()的返回值,共有三種:

 public static final int SNAP_TO_START = -1; 
 public static final int SNAP_TO_END = 1;
 public static final int SNAP_TO_ANY = 0;

SNAP_TO_START使子視圖的左側(cè)或頂部與父視圖的左側(cè)或頂部對齊。
SNAP_TO_END使子視圖的右側(cè)或底部與父視圖的右側(cè)面或底部對齊。
SNAP_TO_ANY根據(jù)子視圖的當前位置與父布局的關(guān)系,決定子視圖是否從頭到尾跟隨。
比如,如果子視圖實際位于RecyclerView的左側(cè),SNAP_TO_ANY和SNAP_TO_START是沒有
差別的。
默認值就是SNAP_TO_ANY啦。
具體什么效果大家可以試試啦,本文只是拋磚引玉。
結(jié)束,謝謝~~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容