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滑动功能》
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。