欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

支持scrollTo的RecycleView

程序员文章站 2022-09-14 17:29:38
RecycleView内部没有帮我们实现ScrollTo的方法,不过帮我们实现了ScrollBy,我们可以通过ScrollBy自定义一个支持scrollTo的RecycleView。 ......

recycleview内部没有帮我们实现scrollto的方法,不过帮我们实现了scrollby,我们可以通过scrollby自定义一个支持scrollto的recycleview。

public class scrolltorecyclerview extends recyclerview {
    //记录滚动的总距离,类似view中的mscrollx和mscrolly
    private int sx = 0, sy = 0;
    //自己定义的滚动监听接口

    public interface recyclerscrollchangelistener{
        void scrollchange(int y);
    }

    private recyclerscrollchangelistener mscrolllistener = null;

    public scrolltorecyclerview(context context) {
        super(context);
        addscrolllistener();
    }

    public scrolltorecyclerview(context context, @nullable attributeset attrs) {
        super(context, attrs);
        addscrolllistener();
    }

    public scrolltorecyclerview(context context, @nullable attributeset attrs, int defstyle) {
        super(context, attrs, defstyle);
        addscrolllistener();

    }
    //重写scrollto方法,通过内部的scrollby实现scrollto的功能
    @override
    public void scrollto(int x, int y) {
        super.scrollto(x, y);
        //计算滚动的相对距离,通过传进来的x和当前的sx差值就是scrollby需要滚动的值
        scrollby(x - sx, y - sy);
    }
    //添加view的scrolllistener,在view滚动时根据滚动的距离自己计算sx,sy
    private void addscrolllistener(){
        addonscrolllistener(new onscrolllistener() {
            @override
            public void onscrolled(recyclerview recyclerview, int dx, int dy) {
//                oldsx = sx;
//                oldsy = sy
                //因为dx和dy是相对上次的滚动距离,所以通过一开始的累加可以得到总的sx和sy
                sx += dx;
                sy += dy;
                super.onscrolled(recyclerview, dx, dy);
                //此处如果有需要监听滚动变化的话在这回调
                if(mscrolllistener != null){
                    mscrolllistener.scrollchange(sy);
                }
            }
        });
    }
    //设置监听
    public void setrecyclerscrolllistener(recyclerscrollchangelistener scrolllistener) {
        this.mscrolllistener = scrolllistener;
    }
}