1.ViewPager与横向RecyclerView之间的滑动冲突
目前,企鹅FM项目中,很多页面使用ViewPager+ TabLayout (如首页、详情页、搜索结果页等),而对应页面很多时候会嵌套一个横向RecycleView,用来展现更多的信息,如下,在RecycleView中滑动到最后一个元素时,会同时带动ViewPager滑动,这种体验极差。
原因分析:
作为子View 的RecyclerView在滑到最后一个或第一个ItemView到导致ViewPager滑动,这一定是ViewPager在此刻对滑动事件进行了拦截,解决的最简单办法就是不让ViewPager拦截横向RecyclerView的滑动事件(即ViewPager::onInterceptTouchEvent方法返回false),ViewPager::onInterceptTouchEvent中的Move 事件如下:
目前,有以下两种方式使ViewPager 不去拦截横向RecyclerView 滑动事件:
1).在RecyclerView 对应滑动事件分发中调用
getParent().requestDisallowInterceptTouchEvent(true); 阻止ViewPager对其MOVE或者UP事件进行拦截,但是考虑的因素比较多,而且效果不是太好,故放弃这种方式。
2).修改某些方法,进入到上图if判断中
在滑动横向RecyclerView 到两端时,dx != 0 && !isGutterDrag(mLastMotionX, dx) 肯定满足条件,那说明canScroll()(用来判断一个View以及它的子View是否可以滑动)一定返回了false, 复写canScroll()方法,打log,发现返回果然为false,验证了自己的判断。
解决办法:复写canScroll,当View 是横向RecyclerView(LinearLayoutManager 包含GridLayoutManager)时,直接返回true即可解决问题,解决代码如下:
类似的冲突还有ViewPager 和HorizontalScrollView 等等,解决方式与上