美文网首页UI
解决RecyclerView嵌套,滑动冲突问题

解决RecyclerView嵌套,滑动冲突问题

作者: 惟吾德馨_慧 | 来源:发表于2021-05-10 17:59 被阅读0次

    解决RecyclerView嵌套时,子RecyclerView不能滑动,记录以下3种方法。

    参考文章:https://www.jianshu.com/p/c5ccf0c38186

    public boolean dispatchTouchEvent(MotionEvent ev)
    用来进行事件的分发。如果事件能够传递给当前View,那么此方法一定会被调用,返回的结果受当前View的onTouchEvent和下级View的dispatchTouchEvent方法影响,表示是否消耗当前事件。

    public boolean onInterceptTouchEvent(MotionEvent ev)
    在dispatchTouchEvent(MotionEvent ev)方法内部调用,用来判断是否拦截某个事件,那么在同一个事件系列当中,此方法不会被再次调用,返回结果表示是否拦截当前事件。

    public boolean onTouchEvent(MotionEvent ev)
    在dispatchTouchEvent(MotionEvent ev)方法中调用,用来处理点击事件,返回的结果表示是否消耗当前事件,如锅不消耗,这在同一个事件系列中,当前View无法再接收到事件。

    方法一:自定义父recyclerView并重写onInterceptTouchEvent()方法

    //不拦截,继续分发下去
    @Override
    public boolean onInterceptTouchEvent(MotionEvent e) {
        return false;
    }
    

    方法二:子布局通知父布局不要拦截事件

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
         //父层ViewGroup不要拦截点击事件
        getParent().requestDisallowInterceptTouchEvent(true);
        return super.dispatchTouchEvent(ev);
    }}
    

    方法三:OnTouchListener优先级很高,通过这个来告诉父布局,不要拦截我的事件

    childRecyclerView.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        int action = event.getAction();
        if (action == MotionEvent.ACTION_DOWN || action == MotionEvent.ACTION_MOVE) {
            v.getParent().requestDisallowInterceptTouchEvent(true);
        } else {
            v.getParent().requestDisallowInterceptTouchEvent(false);
        }
        return false;
        }
    });
    

    每天进步一点点。。。(2021-05-10)

    相关文章

      网友评论

        本文标题:解决RecyclerView嵌套,滑动冲突问题

        本文链接:https://www.haomeiwen.com/subject/kwwidltx.html