解决ScrollView嵌套RecyclerView无法滑动的问题
通过View事件的拦截方法解决ScrollView嵌套RecyclerView无法滑动的问题
前提:这里先介绍两个View的方法
onInterceptTouchEvent方法(只有ViewGroup才有)
返回true: 代表对事件进行拦截, 拦截后事件就无法传到子View中, 也就是无法调用子View的onTouchEvent等方法,
返回false: 代表不对事件进行拦截, 子View可以接收到所有事件(包括Down, Move, UP)
requestDisallowInterceptTouchEvent方法,父容器可以调用此方法来确定是否要拦截当前事件
返回true: 表示子View不需要父视图拦截事件, 就不会调用父容器的onInterceptTouchEvent方法
返回false: 表示子View需要父视图拦截事件, 会继续执行父容器的onInterceptTouchEvent方法
测试ScrollView在哪里将事件进行拦截了
这里通过自定义ScrollView和他的子View,其中MyScrollView重写了onInterceptTouchEvent方法,
MyTextView重写了onTouchEvent方法, 经过调试可以发现:
MyScrollView:
MyTextView:
- ScrollView的onInterceptTouchEvent 方法默认返回时结果如下:
可以发现ScrollView拦截了MyTextView的UP事件
具体可以在ScrollView中可以搜到onInterceptTouchEvent 方法,发现的确对UP事件进行了处理
也尝试下另外两种情况,看是否和前提中写的一样
ScrollView的onInterceptTouchEvent 方法返回false时结果如下:
对MyTextView的onTouchEvent方法的所有事件都不进行拦截ScrollView的onInterceptTouchEvent 方法返回true时结果如下:
发现拦截了MyTextView的所有事件
发现所有返回结果都如前提中说明的一致
然后解决RecyclerView无法滑动的问题, 这里的思路是, 在触发RecyclerView 事件的时候设置父ScrollView的requestDisallowInterceptTouchEvent为true, 让其不再调用onInterceptTouchEvent 从而实现对RecyclerView事件的不拦截, 实现如下:
通过这次的测试,对View事件传递理解的也更加的深刻。