溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Android RecyclerView滾動定位

發(fā)布時間:2020-08-28 10:16:48 來源:腳本之家 閱讀:138 作者:M家杰 欄目:移動開發(fā)

概述
RecyclerView在安卓開發(fā)中非常實用,而且簡單易用,但是在實際開發(fā)中一直有一個問題困擾著我,就是定位問題,實際的項目中總是會遇到這樣的需求:檢索RecyclerView的某一項(各個項的高度不確定),然后定位這一項,將它顯示在頂部。用RecyclerView的默認移動的方法并不能實現(xiàn)這一點(個人感覺官方可能出于性能考慮才不實現(xiàn)這一點)。這篇博客就講解下我個人是如何實現(xiàn)這個需求的。

Demo演示

Android RecyclerView滾動定位

敲代碼前的思考

RecyclerView提供的用于控制移動的方法有2個
- scrollToPosition(int)
這個方法的作用是顯示指定項,就是把你想置頂?shù)捻楋@示出來,但是在屏幕的什么位置是不管的,只要那一項現(xiàn)在看得到了,那它就罷工了!
- scrollBy(int x,int y)
這個方法是自己去控制移動的距離,單位應(yīng)該是像素。

使用scrollToPosition時,移動到前面的項時,它默認會將要顯示的項置頂,但是移動到后面的項時,位置就說不好了(看它心情!)一般會顯示在最后一個。用過的應(yīng)該都有所了解。
使用scrollBy時就需要自己計算高度或者寬度。在動態(tài)的布局中且各項樣式高度可能都不一樣的情況下,自己計算高度是很有難度的。

上面說了這么多廢話,結(jié)論就是這2個方法都不能很好解決問題,但是,當(dāng)他們2個結(jié)合使用的時候,我們的問題就變的好解決很多了!

思路是:先用scrollToPosition,將要置頂?shù)捻椣纫苿语@示出來,然后計算這一項離頂部的距離,用scrollBy完成最后的100米!

關(guān)鍵代碼

先傳入要置頂?shù)趲醉?,然后區(qū)分情況處理

 private void moveToPosition(int n) {
    //先從RecyclerView的LayoutManager中獲取第一項和最后一項的Position
    int firstItem = mLinearLayoutManager.findFirstVisibleItemPosition();
    int lastItem = mLinearLayoutManager.findLastVisibleItemPosition();
    //然后區(qū)分情況
    if (n <= firstItem ){
    //當(dāng)要置頂?shù)捻椩诋?dāng)前顯示的第一個項的前面時
      mRecyclerView.scrollToPosition(n);
    }else if ( n <= lastItem ){
    //當(dāng)要置頂?shù)捻椧呀?jīng)在屏幕上顯示時
      int top = mRecyclerView.getChildAt(n - firstItem).getTop();
      mRecyclerView.scrollBy(0, top);
    }else{
    //當(dāng)要置頂?shù)捻椩诋?dāng)前顯示的最后一項的后面時
      mRecyclerView.scrollToPosition(n);
      //這里這個變量是用在RecyclerView滾動監(jiān)聽里面的
      move = true;
    }

  }

RecyclerView滾動監(jiān)聽

class RecyclerViewListener extends RecyclerView.OnScrollListener{
    @Override
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
      super.onScrolled(recyclerView, dx, dy);
      //在這里進行第二次滾動(最后的100米?。?      if (move ){
        move = false;
        //獲取要置頂?shù)捻椩诋?dāng)前屏幕的位置,mIndex是記錄的要置頂項在RecyclerView中的位置
        int n = mIndex - mLinearLayoutManager.findFirstVisibleItemPosition();
        if ( 0 <= n && n < mRecyclerView.getChildCount()){
          //獲取要置頂?shù)捻楉敳侩xRecyclerView頂部的距離
          int top = mRecyclerView.getChildAt(n).getTop();
          //最后的移動
          mRecyclerView.scrollBy(0, top);
        }
      }
    }
  }

Demo下載

[CSDN]:http://xiazai.jb51.net/201701/yuanma/RecyclerViewLocation(jb51.net).rar

[GitHub]:https://github.com/tyzlmjj/AndroidUI/tree/master/RecyclerViewLocation

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持億速云。

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI