RecyclerView選中item居中顯示

使用RecyclerView時(shí)需要將選中的item在View中居中顯示,RecyclerView的scrollToPosition(position)方法只會(huì)將position所對(duì)應(yīng)的item滾動(dòng)到屏幕中顯示,但是不會(huì)講item居中;scrollToPosition(position)方法調(diào)用后有三種情況:

1.position對(duì)應(yīng)的item在第一個(gè)可見item之前

最后會(huì)將item顯示在RecyclerView的頂部

2.position對(duì)應(yīng)的item在最后一個(gè)可見item之后

最后會(huì)將item顯示在RecyclerView的底部

3.position對(duì)應(yīng)的item已經(jīng)可見

沒有任何效果

如果我們需要將position對(duì)應(yīng)的item居中顯示怎么辦?

上面的3種情況說明,直接使用scrollToPosition(position)是不行的,但是可以算出position的offset(偏移量)來使item居中顯示,偏移量計(jì)算如下:

public int computePositionOffset(int position) {
        int offsetPosition = 0;

        int firstPosition = mRecyclerView.getChildLayoutPosition(mRecyclerView.getChildAt(0));
        int lastPosition = mRecyclerView.getChildLayoutPosition(mRecyclerView.getChildAt(mRecyclerView.getChildCount() - 1));
        //獲取firstPosition,lastPosition的第二種方法
//        LinearLayoutManager manager = (LinearLayoutManager) mRecyclerView.getLayoutManager();
//        int firstPosition = manager.findFirstVisibleItemPosition();
//        int lastPosition = manager.findLastVisibleItemPosition();

        //最大的position
        int maxPosition = myAdapter.getItemCount() - 1;
        //position的偏移量
        int offset = (lastPosition - firstPosition) / 2; 
       
        if (firstPosition > position) { //第一種情況
            offsetPosition = position - offset;
        } else if (lastPosition < position) { //第二種情況
            offsetPosition = position + offset;
        } else { //第三種情況
            if (lastPosition - position > position - firstPosition) {//第三種情況中position在中心點(diǎn)偏上
                offsetPosition = position - offset;
            } else {//第三種情況中position在中心點(diǎn)偏下
                offsetPosition = position + offset;
            }
        }
        //偏移過的offsetPosition越界
        if (offsetPosition < 0) {
            offsetPosition = 0;
        } else if (offsetPosition > maxPosition) {
            offsetPosition = maxPosition;
        }
        return offsetPosition;
    }

使用偏移后的offsetPosition可以將目標(biāo)position居中顯示。

以上計(jì)算偏移量的方法有個(gè)問題

firstPosition,lastPosition在RecyclerView還沒有將itemView顯示之前,獲取到的值是-1,這樣會(huì)導(dǎo)致計(jì)算的偏移量不正確。
添加一個(gè)解決辦法,該解決辦法在一定程度下可用,但是局限性較大

LinearLayoutManager manager = (LinearLayoutManager) mRecyclerView.getLayoutManager();
int firstPosition = manager.findFirstVisibleItemPosition();
int lastPosition = manager.findLastVisibleItemPosition();
//當(dāng)獲取到的firstPosition,lastPosition無效的時(shí)候,我們可以當(dāng)做RecyclerView是從第0個(gè)item開始顯示
if (firstPosition < 0){
    firstPosition = 0;
}
if (lastPosition < 1){
    lastPosition = maxItemCounts;//maxItemCounts為RecyclerView在屏幕中從第0個(gè)item開始,能顯示多少個(gè)item;
    /*
    *比如一個(gè)比較簡(jiǎn)單且特殊的情況:
    *已知RecyclerView的高度,
    *所有item高度一致且已知item高度的情況下,
    *maxItemCounts = Math.ceil(RecyclerViewHeight / itemHeight)
    */
}

這個(gè)方法局限性比較大,遇到以下的情況也沒用,比如:

1.RecyclerView的高度無法拿到
2.item的高度無法拿到
3.item的高度不固定(但是如果是能拿到每一個(gè)具體item的高度也可以去做計(jì)算)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 【Android 控件 RecyclerView】 概述 RecyclerView是什么 從Android 5.0...
    Rtia閱讀 308,481評(píng)論 27 440
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,355評(píng)論 25 708
  • 簡(jiǎn)介: 提供一個(gè)讓有限的窗口變成一個(gè)大數(shù)據(jù)集的靈活視圖。 術(shù)語表: Adapter:RecyclerView的子類...
    酷泡泡閱讀 5,387評(píng)論 0 16
  • 簡(jiǎn)介 RecyclerView在24.2.0版本中新增了SnapHelper這個(gè)輔助類,用于輔助RecyclerV...
    辰之貓閱讀 155,980評(píng)論 66 618
  • 我是貓,有九條命。 我被前主人丟棄在一個(gè)馬路邊,叫幸福路。后來,是他救了我,我為他失去了三條命,因?yàn)樗矣謫适Я宋?..
    7138cd632580閱讀 1,902評(píng)論 0 3

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