RecyclerView的scrollToPosition/smoothScrollToPosition滾動(dòng)到頂部

學(xué)廢了,分享出來(lái)

1、scrollToPosition滾動(dòng)指定item到RecyclerView頂部

這個(gè)就很簡(jiǎn)單,調(diào)用RecyclerView的layoutManager.scrollToPositionWithOffset(position, 0);即可

2、smoothScrollToPosition滾動(dòng)指定item到RecyclerView頂部

這個(gè)是平滑帶動(dòng)畫的滾動(dòng)

原理:recyclerView的smoothScrollToPosition方法中調(diào)用了LayoutManager的滑動(dòng)方法。
LinearLayoutManager的smoothScrollToPosition()方法源碼↓↓↓↓↓

    @Override
    public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state,
            int position) {
        LinearSmoothScroller linearSmoothScroller =
                new LinearSmoothScroller(recyclerView.getContext());
        linearSmoothScroller.setTargetPosition(position);
        startSmoothScroll(linearSmoothScroller);
    }

發(fā)現(xiàn)LinearLayoutManager的smoothScrollToPosition()方法中new 了一個(gè)LinearSmoothScroller 的東西來(lái)控制其滑動(dòng),我們重寫LinearSmoothScroller :
我們重寫calculateDtToFit()方法,即可實(shí)現(xiàn)smoothScrollToPosition()使item自動(dòng)置頂功能.

public class StickyTopicScroller extends LinearSmoothScroller {
    public StickyTopicScroller(Context context) {
        super(context);
    }

    @Override
    public int calculateDtToFit(int viewStart, int viewEnd, int boxStart, int boxEnd, int snapPreference) {
      //原本的返回值      
      //return super.calculateDtToFit(viewStart, viewEnd, boxStart, boxEnd, snapPreference);

      //修改,返回item置頂?shù)钠屏?      return boxStart - viewStart;
    }

    @Override
    protected float calculateSpeedPerPixel(DisplayMetrics displayMetrics) {
        return super.calculateSpeedPerPixel(displayMetrics);
    }
}

如上方法實(shí)現(xiàn)了item自動(dòng)置頂功能,我們自定義StickyTopicItemLayoutManager繼承LinearLayoutManager 重寫smoothScrollToPosition方法,方法中設(shè)置上面的StickyTopicScroller

public class StickyTopicItemLayoutManager extends LinearLayoutManager {
    private Context mContext;
    public StickyTopicItemLayoutManager(Context context) {
        super(context);
        mContext = context;
    }

    public StickyTopicItemLayoutManager(Context context, int orientation, boolean reverseLayout) {
        super(context, orientation, reverseLayout);
    }

    public StickyTopicItemLayoutManager(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
    }

    @Override
    public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state, int position) {
        StickyTopicScroller stickyTopicScroller = new StickyTopicScroller(mContext);
        stickyTopicScroller.setTargetPosition(position);
        startSmoothScroll(stickyTopicScroller);
    }
}

使用

給recyclerView設(shè)置我們重寫的StickyTopicItemLayoutManager
recyclerView.setLayoutManager(new StickyTopicItemLayoutManager(this));
調(diào)用平滑滾動(dòng)即可實(shí)現(xiàn)我們想要的置頂
recyclerView.smoothScrollToPosition(position);

說(shuō)明
smoothScrollToPosition置頂摘自這篇文章---RecyclerView 滾動(dòng)到指定position,并置頂

?著作權(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)容

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