通过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:

Android ScrollView无法设置滚动条高度 scrollview无法滑动_返回结果

MyTextView:

Android ScrollView无法设置滚动条高度 scrollview无法滑动_返回结果_02

  1. ScrollView的onInterceptTouchEvent 方法默认返回时结果如下:

可以发现ScrollView拦截了MyTextView的UP事件

具体可以在ScrollView中可以搜到onInterceptTouchEvent 方法,发现的确对UP事件进行了处理

Android ScrollView无法设置滚动条高度 scrollview无法滑动_返回结果_03

也尝试下另外两种情况,看是否和前提中写的一样

  1. ScrollView的onInterceptTouchEvent 方法返回false时结果如下:
  2. Android ScrollView无法设置滚动条高度 scrollview无法滑动_返回结果_04

  3. 对MyTextView的onTouchEvent方法的所有事件都不进行拦截
  4. ScrollView的onInterceptTouchEvent 方法返回true时结果如下:
  5. Android ScrollView无法设置滚动条高度 scrollview无法滑动_事件传递_05

  6. 发现拦截了MyTextView的所有事件

发现所有返回结果都如前提中说明的一致

然后解决RecyclerView无法滑动的问题, 这里的思路是, 在触发RecyclerView 事件的时候设置父ScrollView的requestDisallowInterceptTouchEvent为true, 让其不再调用onInterceptTouchEvent 从而实现对RecyclerView事件的不拦截, 实现如下:

Android ScrollView无法设置滚动条高度 scrollview无法滑动_返回结果_06


Android ScrollView无法设置滚动条高度 scrollview无法滑动_返回结果_07

通过这次的测试,对View事件传递理解的也更加的深刻。