PtrClassicFrameLayout+RecyclerView下拉刷新组件与ConvenientBanner/ViewPager 事件冲突

本文分析了一个问题场景,即PtrClassicFrameLayout+RecyclerView结合使用时,由于上拉加载下拉刷新组件的存在,导致内部的ConvenientBanner(基于ViewPager)横向滑动不顺畅。原因是滑动监听主要关注Y轴变化,导致ViewPager无法正常响应水平滑动。为解决此冲突,文章提出了查看并调整事件拦截方法dispatchTouchEvent(MotionEvent e)的建议,并提供了相关参考链接以供深入研究。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、场景分析:

(1)场景:

下拉刷新包裹一个带headlistview,而head包含一个横向滑动的控件eg.ViewPager。测试会发现,ViewPager等横向控件左右手动滑动不太流畅。而且必须是严格的水平滑动(△x>0 ,△y=0)情况下,左右互动才会触发。

补充说明:

 PtrClassicFrameLayout+RecyclerView:一组上拉加载下拉刷新组件。

   ConvenientBanner:广告轮播控件,内部由ViewPager实现。


(2)原因:

在滑动监听时,只监听了坐标y的变化,只要y发生一点偏差,横向滑动的控件eg.ViewPager都不能左右滑动


2、解决方法:



理清上图流程,然后查看源码,在事件拦截dispatchTouchEvent(MotionEvent e)方法中我们会看到下面一段代码:

 case MotionEvent.ACTION_MOVE:

                mLastMoveEvent = e;
                mPtrIndicator.onMove(e.getX(), e.getY());
                float offsetX = mPtrIndicator.getOffsetX();
                float offsetY = mPtrIndicator.getOffsetY();

                if (mDisableWhenHorizontalMove && !mPreventForHorizontal && (Math.abs(offsetX) > mPagingTouchSlop && Math.abs(offsetX) > Math.abs(offsetY))) {
                    if (mPtrIndicator.isInStartPosition()) {
                        mPreventForHorizontal = true;
                    }
                }
                if (mPreventForHorizontal) {
                    return dispatchTouchEventSupper(e);
                }
              ......

其中,mDisableWhenHorizontalMove 表示是否支持横向滑动,该值默认为false,也就是说滑动监听默认只会监听坐标y的变化。这里只要对外暴露一个方法,将其设置为true即可。


ps:其他的一些滑动冲突,也可以适当参考该方法。


相关知识参考   : 

https://www.jianshu.com/p/1602d7207492

https://www.jianshu.com/p/de8ed145c384

http://blog.youkuaiyun.com/bear_huangzhen/article/details/50176075

其他:

  SwipeRefreshLayout和ConvenientBanner 事件冲突解决     参考 http://blog.youkuaiyun.com/u010064206/article/details/50583991         


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值