Welcome

首页 / 移动开发 / Android / Android中RecyclerView嵌套滑动冲突解决的代码片段

在纵向RecyclerView嵌套横向RecyclerView时,如果纵向RecyclerView有下拉刷新功能,那么内部的横向RecyclerView的横向滑动体验会很差.(只有纯横向滑动时,才能滑动内部的横向RecyclerView,否则滑动事件就会影响到下拉刷新),添加拦截判断.

public class MySwipeRefreshLayout extends SwipeRefreshLayout {private boolean mIsVpDragger;private final int mTouchSlop;private float startY;private float startX;public MySwipeRefreshLayout(Context context) {super(context);mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();}public MySwipeRefreshLayout(Context context, AttributeSet attrs) {super(context, attrs);mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();}@Overridepublic boolean onInterceptTouchEvent(MotionEvent ev) {int action = ev.getAction();switch (action) {case MotionEvent.ACTION_DOWN:// 记录手指按下的位置startY = ev.getY();startX = ev.getX();// 初始化标记mIsVpDragger = false;break;case MotionEvent.ACTION_MOVE:// 如果viewpager正在拖拽中,那么不拦截它的事件,直接return false;if (mIsVpDragger) {return false;}// 获取当前手指位置float endY = ev.getY();float endX = ev.getX();float distanceX = Math.abs(endX - startX);float distanceY = Math.abs(endY - startY);// 如果X轴位移大于Y轴位移,那么将事件交给viewPager处理。if (distanceX > mTouchSlop && distanceX > distanceY) {mIsVpDragger = true;return false;}break;case MotionEvent.ACTION_UP:case MotionEvent.ACTION_CANCEL:// 初始化标记mIsVpDragger = false;break;}// 如果是Y轴位移大于X轴,事件交给swipeRefreshLayout处理。return super.onInterceptTouchEvent(ev);}}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。