解决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;
}
});