问题出现场景:
TabLayout + ViewPager + Fragment,Fragment中包含一个横向滑动的RecyclerView,出现了左右滑动RecyclerView时会与ViewPager冲突。
解决思路:
手指触碰到RecyclerView时禁止ViewPager滑动,手指离开时恢复。
解决方法:
1、重写ViewPager使其滑动事件变为可以控制的,代码:
/**
* @Description isCanSlide 设置为false时,viewpager不能横向滑动,用在横向滑动控件与viewpager冲突时
* @Version 1.0
*/
public class CanCtrlSlideViewPager extends ViewPager {
boolean isCanSlide = true;
public CanCtrlSlideViewPager(@NonNull Context context) {
super(context);
}
public CanCtrlSlideViewPager(@NonNull Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if(!isCanSlide){//设置为false时,viewpager不能横向滑动
requestDisallowInterceptTouchEvent(true);//使viewpager不再通过onInterceptTouchEvent捕获触摸事件
}
return super.dispatchTouchEvent(ev);
}
public void setCanSlide(boolean canSlide) {
isCanSlide = canSlide;
}
public boolean isCanSlide() {
return isCanSlide;
}
}
2、监听RecyclerView的OnTouch事件,也可以监听item的OnTouch事件,代码:
setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if(event.getAction() == MotionEvent.ACTION_DOWN){
mViewPager.setCanSlide(false);//viewpager禁止横向滑动
}else if(event.getAction() == MotionEvent.ACTION_UP || event.getAction() == MotionEvent.ACTION_CANCEL){
mViewPager.setCanSlide(true);//viewpager解除禁止横向滑动
}
return false;
}
});
以上亲测有效,如有不足之处,敬请指正。
解决过程遇到的问题:
在百度的过程中,网上的解决方案大多数都是继承RcyclerView并重写onTouch方法,判断手指的滑动行为,再使用
getParent().requestDisallowInterceptTouchEvent(true);
经过测试,并没有效果,猜测应该是 getParent()拿到的并不是Viewpager,解决方法应该是把ViewPager传入RecyclerView中,然后使用ViewPager的引用对象调用requestDisallowInterceptTouchEvent(true)方法。此方法并未验证,纯属猜测。
结束