UI

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

2021-05-10  本文已影响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)

上一篇下一篇

猜你喜欢

热点阅读