首页 > 系统 > Android > 正文

Android中RecyclerView嵌套滑动冲突解决的代码片段

2019-12-12 04:22:22
字体:
来源:转载
供稿:网友

在纵向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(); } @Override public 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); }}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持武林网。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表