安卓爬坑指南之Recylerview

本文主要针对两个问题进行说明:

  • 横向rv和viewpager滚动冲突
  • rv滚动到底部监听

首先我们写一个自定义的rv

public class DefRecylerView extends RecyclerView {
    
    public DefRecylerView(Context context) {
        super(context);
    }

    public DefRecylerView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public DefRecylerView(Context context, @Nullable AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }
}
  1. rv、viewpager滚动冲突

当遇到外层viewpager里面有一个横向滚动的rv,为防止rv滚动到最右侧时触发viewpager的滚动我们需要这样做:

    private ViewPager viewPager = null;

    public void setViewPager(ViewPager viewPager) {
        this.viewPager = viewPager;
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        if (viewPager != null) {
            getParent().requestDisallowInterceptTouchEvent(true);
        }
        return super.dispatchTouchEvent(ev);
    }

我们在自定义的rv中重写dispatchTouchEvent方法,最为核心的一句代码为:
getParent().requestDisallowInterceptTouchEvent(true);
意思是当外层view是viewpager时,我们取消viewpager对滚动事件的拦截,让滚动事件继续往下传递到rv,从而实现了横向rv滚动到最右侧时不触发viewpager的滚动。

  1. rv滚动到底部监听

自定义rv中重写onScroll方法,定义一个回调接口,当rv滚动到底部时回调通知,适用于列表数据加载更多操作。

回调接口:

public interface OnSlideBottomListener {
    /**
     * 滚动到底部
     */
    void onSlideBottom();
}

重写onScroll:

    private OnSlideBottomListener onSlideBottomListener = null;

    public void setOnSlideBottomListener(OnSlideBottomListener onSlideBottomListener) {
        this.onSlideBottomListener = onSlideBottomListener;
    }
    
    @Override
    public void onScrolled(int dx, int dy) {
        if (isSlideToBottom()) {
            if (onSlideBottomListener != null) {
                onSlideBottomListener.onSlideBottom();
            }
        }
    }

    /**
     * 是否滑动到底部
     */
    public boolean isSlideToBottom() {
        if (this.getLayoutManager() instanceof LinearLayoutManager) {
            LinearLayoutManager layoutManager = (LinearLayoutManager) this.getLayoutManager();
            if (layoutManager.getOrientation() == LinearLayoutManager.VERTICAL) {
                return this != null
                        && this.computeVerticalScrollExtent() + this.computeVerticalScrollOffset()
                        >= this.computeVerticalScrollRange();
            } else {
                return this != null
                        && this.computeHorizontalScrollExtent() + this.computeHorizontalScrollOffset()
                        >= this.computeHorizontalScrollRange();
            }
        } else if(this.getLayoutManager() instanceof StaggeredGridLayoutManager){
            StaggeredGridLayoutManager layoutManager = (StaggeredGridLayoutManager) this.getLayoutManager();
            if (layoutManager.getOrientation() == StaggeredGridLayoutManager.VERTICAL) {
                return this != null
                        && this.computeVerticalScrollExtent() + this.computeVerticalScrollOffset()
                        >= this.computeVerticalScrollRange();
            } else {
                return this != null
                        && this.computeHorizontalScrollExtent() + this.computeHorizontalScrollOffset()
                        >= this.computeHorizontalScrollRange();
            }
        }

        return false;
    }
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,898评论 25 709
  • 内容抽屉菜单ListViewWebViewSwitchButton按钮点赞按钮进度条TabLayout图标下拉刷新...
    皇小弟阅读 46,922评论 22 665
  • 原文链接:https://github.com/opendigg/awesome-github-android-u...
    IM魂影阅读 33,006评论 6 472
  • 很久以前,我都还未感觉这刺骨的痛心,直至你的出现,我才知道了什么叫做喜欢一个人是想让她过得很快乐。我是一个不怎么喜...
    南央浮城阅读 234评论 0 1
  • 最近看了《末代皇帝》,片中溥仪皇帝在乱世中成长,处处身不由己,不禁让人惋惜。不过他的政治敏感度也真是让人堪忧。三岁...
    Anna亚男阅读 235评论 0 2