Android RecyclerView滾動定位

轉載請標明出處:
http://blog.csdn.net/tyzlmjj/article/details/49227601
本文出自:【M家傑的博客】ide

概述
RecyclerView在安卓開發中很是實用,並且簡單易用,可是在實際開發中一直有一個問題困擾着我,就是定位問題,實際的項目中老是會遇到這樣的需求:檢索RecyclerView的某一項(各個項的高度不肯定),而後定位這一項,將它顯示在頂部。用RecyclerView的默認移動的方法並不能實現這一點(我的感受官方可能出於性能考慮纔不實現這一點)。這篇博客就講解下我我的是如何實現這個需求的。佈局

Demo演示性能


敲代碼前的思考
RecyclerView提供的用於控制移動的方法有2個
- scrollToPosition(int)
這個方法的做用是顯示指定項,就是把你想置頂的項顯示出來,可是在屏幕的什麼位置是無論的,只要那一項如今看獲得了,那它就罷工了!
- scrollBy(int x,int y)
這個方法是本身去控制移動的距離,單位應該是像素。.net

使用scrollToPosition時,移動到前面的項時,它默認會將要顯示的項置頂,可是移動到後面的項時,位置就說很差了(看它心情!)通常會顯示在最後一個。用過的應該都有所瞭解。
使用scrollBy時就須要本身計算高度或者寬度。在動態的佈局中且各項樣式高度可能都不同的狀況下,本身計算高度是頗有難度的。blog

上面說了這麼多廢話,結論就是這2個方法都不能很好解決問題,可是,當他們2個結合使用的時候,咱們的問題就變的好解決不少了!開發

思路是:先用scrollToPosition,將要置頂的項先移動顯示出來,而後計算這一項離頂部的距離,用scrollBy完成最後的100米!get

關鍵代碼
先傳入要置頂第幾項,而後區分狀況處理博客

 private void moveToPosition(int n) {
        //先從RecyclerView的LayoutManager中獲取第一項和最後一項的Position
        int firstItem = mLinearLayoutManager.findFirstVisibleItemPosition();
        int lastItem = mLinearLayoutManager.findLastVisibleItemPosition();
        //而後區分狀況
        if (n <= firstItem ){
        //當要置頂的項在當前顯示的第一個項的前面時
            mRecyclerView.scrollToPosition(n);
        }else if ( n <= lastItem ){
        //當要置頂的項已經在屏幕上顯示時
            int top = mRecyclerView.getChildAt(n - firstItem).getTop();
            mRecyclerView.scrollBy(0, top);
        }else{
        //當要置頂的項在當前顯示的最後一項的後面時
            mRecyclerView.scrollToPosition(n);
            //這裏這個變量是用在RecyclerView滾動監聽裏面的
            move = true;
        }it

    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
RecyclerView滾動監聽io

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;
                //獲取要置頂的項在當前屏幕的位置,mIndex是記錄的要置頂項在RecyclerView中的位置
                int n = mIndex - mLinearLayoutManager.findFirstVisibleItemPosition();
                if ( 0 <= n && n < mRecyclerView.getChildCount()){
                    //獲取要置頂的項頂部離RecyclerView頂部的距離
                    int top = mRecyclerView.getChildAt(n).getTop();
                    //最後的移動
                    mRecyclerView.scrollBy(0, top);
                }
            }
        }
    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

———————————————— 版權聲明:本文爲CSDN博主「M家傑」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處連接及本聲明。 原文連接:https://blog.csdn.net/tyzlmjj/article/details/49227601

相關文章
相關標籤/搜索