RecyclerView的scrollToPosition/sm

2021-08-20  本文已影响0人  带带我

学废了,分享出来

1、scrollToPosition滚动指定item到RecyclerView顶部

这个就很简单,调用RecyclerView的layoutManager.scrollToPositionWithOffset(position, 0);即可

2、smoothScrollToPosition滚动指定item到RecyclerView顶部

这个是平滑带动画的滚动

原理:recyclerView的smoothScrollToPosition方法中调用了LayoutManager的滑动方法。
LinearLayoutManager的smoothScrollToPosition()方法源码↓↓↓↓↓

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

发现LinearLayoutManager的smoothScrollToPosition()方法中new 了一个LinearSmoothScroller 的东西来控制其滑动,我们重写LinearSmoothScroller :
我们重写calculateDtToFit()方法,即可实现smoothScrollToPosition()使item自动置顶功能.

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置顶的偏移量
      return boxStart - viewStart;
    }

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

如上方法实现了item自动置顶功能,我们自定义StickyTopicItemLayoutManager继承LinearLayoutManager 重写smoothScrollToPosition方法,方法中设置上面的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设置我们重写的StickyTopicItemLayoutManager
recyclerView.setLayoutManager(new StickyTopicItemLayoutManager(this));
调用平滑滚动即可实现我们想要的置顶
recyclerView.smoothScrollToPosition(position);

说明
smoothScrollToPosition置顶摘自这篇文章---RecyclerView 滚动到指定position,并置顶

上一篇 下一篇

猜你喜欢

热点阅读