Android中RecyclerView嵌套滑动冲突解决的代码片段
在纵向RecyclerView嵌套横向RecyclerView时,如果纵向RecyclerView有下拉刷新功能,那么内部的横向RecyclerView的横向滑动体验会很差.(只有纯横向滑动时,才能滑动内部的横向RecyclerView,否则滑动事件就会影响到下拉刷新),添加拦截判断.
publicclassMySwipeRefreshLayoutextendsSwipeRefreshLayout{
privatebooleanmIsVpDragger;
privatefinalintmTouchSlop;
privatefloatstartY;
privatefloatstartX;
publicMySwipeRefreshLayout(Contextcontext){
super(context);
mTouchSlop=ViewConfiguration.get(context).getScaledTouchSlop();
}
publicMySwipeRefreshLayout(Contextcontext,AttributeSetattrs){
super(context,attrs);
mTouchSlop=ViewConfiguration.get(context).getScaledTouchSlop();
}
@Override
publicbooleanonInterceptTouchEvent(MotionEventev){
intaction=ev.getAction();
switch(action){
caseMotionEvent.ACTION_DOWN:
//记录手指按下的位置
startY=ev.getY();
startX=ev.getX();
//初始化标记
mIsVpDragger=false;
break;
caseMotionEvent.ACTION_MOVE:
//如果viewpager正在拖拽中,那么不拦截它的事件,直接returnfalse;
if(mIsVpDragger){
returnfalse;
}
//获取当前手指位置
floatendY=ev.getY();
floatendX=ev.getX();
floatdistanceX=Math.abs(endX-startX);
floatdistanceY=Math.abs(endY-startY);
//如果X轴位移大于Y轴位移,那么将事件交给viewPager处理。
if(distanceX>mTouchSlop&&distanceX>distanceY){
mIsVpDragger=true;
returnfalse;
}
break;
caseMotionEvent.ACTION_UP:
caseMotionEvent.ACTION_CANCEL:
//初始化标记
mIsVpDragger=false;
break;
}
//如果是Y轴位移大于X轴,事件交给swipeRefreshLayout处理。
returnsuper.onInterceptTouchEvent(ev);
}
}
更多关于滑动功能的文章,请点击专题:《Android滑动功能》
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。