资讯专栏INFORMATION COLUMN

支持scrollTo的RecycleView

Yang_River / 1926人阅读

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

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;
    }
}

 

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/2769.html

相关文章

  • RecycleView 与 Elevation

    摘要:以前一直用,因为可以搞定绝大部分需求。如果只用做透明的分割线,复写就可以实现了。列表本身如果对分割线的不敏感,复写就可以。阴影是子打在父上的子必须设置父必须比子稍大一些,父不要用,在子上用属性 RecycleView 以前一直用ListView,因为ListView可以搞定绝大部分需求。最近项目UI做了很大调整,需要宽度不同的Item混排,记录一下遇到的问题。类似这样效果 showIm...

    neu 评论0 收藏0
  • android最佳实践(三)

    这是一个系列,我们将其命名为android最佳实践,如果你还没有看之前的文章: Android最佳实践(一) android最佳实践(二) android最佳实践(四) android最佳实践(五) Android最佳实践(六)之扫描二维码模块 现阶段,我们创建了最简单的Android项目,现在在此公布github链接https://github.com/neuyu/android-best-pr...

    vvpale 评论0 收藏0
  • RecycleView设置顶部分割线(记录一个坑)

    摘要:大家都知道,想给设置分割线可以重写项目过程中,遇到一个需求顶部有一条灰色的间隔,我想到了给设置分割线的方法,当然只给第一个设置,而且在上方。结果出现了一个现象,顶部分割线一直停留在顶部,不会跟着移动。大家都知道,想给RecycleView设置分割线可以重写RecyclerView.ItemDecoration 项目过程中,遇到一个需求:RecycleView顶部有一条灰色的间隔,我想到了给R...

    TIGERB 评论0 收藏0
  • RecycleViewnotifyItemRemoved使用注意

    转载请标明出处,维权必究:https://www.cnblogs.com/tangZH/p/10116095.html 我们为了移除RecycleView的某一项,会用RecycleView的notifyItemRemoved(int position)方法,但是需要注意的是:1、用该方法之后并不会刷新Item,也就是说不会重新bind数据,那么position也就没有刷新,每个Item对应的po...

    li21 评论0 收藏0
  • 实现可拖拽RecycleView

    showImg(https://segmentfault.com/img/bVs7T5); 其实实现这种效果有两种方法: View.startDrag(), 然后给需要监听拖拽的控件setOnDragListener. ItemTouchHelper,这种实现方法更为简单,具体可参考链接描述 这里我是用的第一种方法,因为感觉第二种方法已经烂大街了。。况且第二种方法只能在RecycleView...

    Shimmer 评论0 收藏0

发表评论

0条评论

阅读需要支付1元查看
<