Android开发

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

本文主要是介绍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();
 }


 @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);
 }
}

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

这篇关于Android中RecyclerView嵌套滑动冲突解决的代码片段的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!