recycleview横向展开_RecyclerView 体验优化及入坑总结

本文总结了RecyclerView在横向滑动时遇到的问题及解决方案,包括与ViewPager、HorizontalScrollView的滑动冲突,以及内部ItemView停在中间态的问题。通过调整TouchSlop值、复写canScroll方法和保存恢复滚动偏移位置等方式优化了用户体验。
摘要由CSDN通过智能技术生成

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 等等,解决方式与上

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值