PtrFrameLayout的dispatchTouchEvent方法实现没有考虑到requestDisallowInterceptTouchEvent,这样导致ViewPager不能通过requestDisallowInterceptTouchEvent解决PrtFrameLayout和ViewPager的事件冲突。 解决办法请看我的博客。http://dengyin2000.iteye.com/blog/2232210
Activity
Lee-swifter commentedon Aug 10, 2015
我试了下,按照你的博客来,还是没能解决问题。ViewPager可正常滑动,但是此时下拉刷新却很容易出不来。
liaohuqiu commentedon Aug 10, 2015
PtrFrameLayout.disableWhenHorizontalMove(true)
这个不能解决问题吗?Lee-swifter commentedon Aug 11, 2015
试了下,没什么效果,可能是因为我用的是第三方的banner,不是原生ViewPager的缘故。
我再尝试一下其他的方法吧,谢谢 @liaohuqiu @dengyin2000
Aspsine commentedon Sep 12, 2015
将
move事件中的
修改为:
然后将
mPagingTouchSlop = conf.getScaledTouchSlop() * 2,
改为
mPagingTouchSlop = conf.getScaledTouchSlop();
感谢 @liaohuqiu 提供这么伟大的库,我从中学到了很多。
xiaoluome commentedon Oct 28, 2015
@Aspsine 你好,你的这种改法也是解决不了问题啊,我用的是GridView里面有Item是横向RecyclerView,还有轮播图ViewPager,都有点问题,横向滑动时,都会往下一点移动,导致不能横向
Aspsine commentedon Oct 28, 2015
@ixiaoluo
好久不见。之前写的,粗心没测试。现在更新了一下,测试没问题。
希望能帮到你。
mmchong3173 commentedon Nov 3, 2015
@Aspsine 请问你更新在哪里。
Aspsine commentedon Nov 4, 2015
@mmchong3173
我更新了之前给的解决方案。从这楼开始倒数第5楼。
mmchong3173 commentedon Nov 4, 2015
@Aspsine 我看到了,那意味着我只能下载源码修改后再依赖到项目里面咯?我现在是这么使用的compile 'in.srain.cube:ultra-ptr:1.0.11'
Aspsine commentedon Nov 4, 2015
@mmchong3173
是的。也可以以lib项目引入,修改源码,测试好。然后build一次,在build目录里面找到aar包,然后删除依赖项目,直接引用aar。等秋大 fix了以后再更换依赖。总之public 的api不变。
mmchong3173 commentedon Nov 4, 2015
@Aspsine 你好,我试了你的方案,发现viewpager在move的过程中只要稍稍有垂直方向的移动便会回到原来的位置,实际效果就是很难翻页。我的xml布局是直接在PtrFrameLayout里面嵌套一个v4包的Viewpager,而且我也把此方案放到了该项目的demo中,效果也是一样的,不知道是不是我使用的方式不对,望能指出,谢谢。
21 remaining items
xanaduo commentedon Aug 25, 2016
能不能把改的放到这个库里面,这样你们问题是解决了,但是库还是有问题吧
pzhangleo commentedon Aug 25, 2016
现在库的所有人没有在维护了吧,好多pr都没有处理,我建议咱们fork一个,大家一起维护吧
frankfancode commentedon Dec 7, 2016
场景:
PtrFrameLayout 中有竖向 Recyclerview,竖向Recyclerview 中有 ViewPager 写得横向轮播图 和 横向 Recyclerview。
问题:
横向滑动轮播图时,卡顿断续。
解决方法:
修改 PtrFrameLayout 中代码,
将
改成
使 横滑 灵敏。
将
改成
新增全局变量
private int mHorizontalMoveSlop=20;//设置水平滑动的灵敏性
之所以不用 TouchSlop 是因为 不同的手机上的 TouchSlop 大小不一样,改之后效果不一样,一加上的是 24,moto 上的 是 72 ,72对于横滑来说太大了,我都统一改小了。不同的手机上效果就一样了
感谢秋大 和 Aspsine 。
tangjie1989 commentedon Jan 4, 2017
mPagingTouchSlop = conf.getScaledTouchSlop() * 2; 修改为 mPagingTouchSlop = conf.getScaledTouchSlop() recyclerview+viewpager 外套下拉刷新 改完后viewpager滑动好很多。
hui453694187 commentedon Jan 11, 2017
请问在WebView 的头部 有一个 banner 的时候导致, banner 左右滑动很容易触发下拉刷新, 这种 如何处理, 如何自己处理事件的分发, 自定义手指下滑距离和左右滑动距离来判断是下啦,还是滑动banner ?
imliujun commentedon Feb 15, 2017
这个问题都这么久了,我感觉还是我的解决方案效果最好。 @yanzhenjie 你的这个方案是解决了左右滑的问题,但是下拉刷新变得非常不灵敏
#181 是我提交的PR
shenminjie commentedon Mar 7, 2017
感谢 @yanzhenjie 的解决方案,但你这个存在着下拉刷新不太灵敏,用户体验也不太好。我这里有个解决方案,在你这个基础上,添加HorizontalMoveView获取水平滑动的手势监听,当手势在HorizontalMoveView才进行拦截,这样就减少了其他区域的下拉事件的冲突,提高下拉刷新的灵敏。
PtrFrameLayout.java:
line 317:
各位有需要可以查看我的fork
修复viewPager事件冲突liaohuqiu#133
dingbuoyi commentedon Mar 9, 2017
@lzyzsd 这个PR什么时候可以合并进去。。。这个issue还是挺严重的
dingbuoyi commentedon Mar 9, 2017
@Lee-swifter 你的方法不推荐了,就算能解决VIEW PAGER的问题,也不适用于横向 recycle view。
dingbuoyi commentedon Mar 9, 2017
@pip1998
@imliujun
你们的代码都试过,我测试场景是scrollview里面嵌套了横向recycleview,都没有效果
msdx commentedon Apr 20, 2017
我也遇到了这个问题,不过我的问题不复杂,退回1.0.9之后可以解决。但是我看了一下PtrFrameLayout的实现,有些粗浅看法:
在Android的事件模型中,一个事件会经过分发、拦截、消费这三个过程。顶层往下分发,也可以拦截事件不让其往下分发,如果下层没有消费事件,上层才消费。
由于上层可以中断事件向下层的传递,而存在着这样的场景:上层可能需要拦截事件向下层的传递,而下层可能又需要事件。所以会有
requestDisallowInterceptTouchEvent
的情景。而在PtrFrameLayout中,对事件的处理选择了在分发的这个过程中处理,从出发点上它就已经忽略(忽视)了下层不想让上层拦截事件的情况。
事件是否不允许被拦截使用
mGroupFlags
标志位判断,不过很遗憾该变量是@hide
的pzhangleo commentedon Apr 21, 2017
考虑重启一个项目,来完善这个库吧,作者已经没时间维护了吧
yunmenggyy commentedon Nov 2, 2017
大家好,我也遇到了这个问题,我的页面顶级是
PtrFrameLayout,然后里面包含了一个
scrollView,scrollView中包含一个圆形的自定义sickBar。我在滑动SickBar的时候,事件会被外层消费掉。我也直接使用方法
requestDisallowInterceptTouchEvent但是没效果 最终的解决方案是在自定义的sickBar中添加一个触摸监听,滑动的时候调用
PtrFrameLayout的
setEnabled(false),然后滑动结束以后调用
setEnabled(true)`nailperry-zd commentedon Dec 27, 2017
@yanzhenjie 使用你的方案后,下拉刷新变得很不灵敏了