Android SwipRefreshLayout与ViewPager滑动冲突解决

大概方法:重写SwipeRefreshLayout的onInterceptTouchEvent(),在里边判断滑动是X轴为主还是Y轴为主,再决定反发给谁处理 上代码 : package com.lldsp.android.dkdq.myview;

import android.content.Context; import android.support.v4.widget.SwipeRefreshLayout; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewConfiguration; import android.widget.AbsListView; import android.widget.ListView;

import com.lldsp.android.dkdq.R;

/**

  • (带上拉加载的SwipeRefreshLayout )

  • (功能详细描述)

  • @author [yyh] */ public class RefreshLayout extends SwipeRefreshLayout implements AbsListView.OnScrollListener {

    /**

    • 滑动到最下面时的上拉操作 / private int mTouchSlop; /*
    • listview实例 */ private ListView mListView;

    /**

    • 上拉监听器, 到了最底部的上拉加载操作 / private OnLoadListener mOnLoadListener; /*
    • 滑动监听器 / private OnScrollListener mOnScrollListener; /*
    • ListView的加载中footer */ private View mListViewFooter;

    /**

    • 按下时的y坐标 / private int mYDown; /*
    • 抬起时的y坐标, 与mYDown一起用于滑动到底部时判断是上拉还是下拉 / private int mLastY; /*
    • 是否在加载中 ( 上拉加载更多 ) */ private boolean isLoading = false;

    private float startY; private float startX; // 记录viewPager是否拖拽的标记 private boolean mIsVpDragger; /**

    • @param context */ public RefreshLayout(Context context) { this(context, null); }

    public RefreshLayout(Context context, AttributeSet attrs) { super(context, attrs);

     mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
    
     mListViewFooter = LayoutInflater.from(context).inflate(R.layout.listview_footer, null,
             false);
    

    }

    @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { super.onLayout(changed, left, top, right, bottom);

     // 初始化ListView对象
     if (mListView == null) {
         getListView();
     }
    

    }

    /**

    • 获取ListView对象 */ private void getListView() { int childs = getChildCount(); for (int i = 0; i < childs; i++) { View childView = getChildAt(i); if (childView instanceof ListView) { mListView = (ListView) childView; // 设置滚动监听器给ListView, 使得滚动的情况下也可以自动加载 mListView.setOnScrollListener(this); return; } } } @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); } /*

    • (non-Javadoc)

    • @see android.view.ViewGroup#dispatchTouchEvent(android.view.MotionEvent) */ @Override public boolean dispatchTouchEvent(MotionEvent event) { final int action = event.getAction();

      switch (action) { case MotionEvent.ACTION_DOWN: // 按下 mYDown = (int) event.getRawY(); break;

       case MotionEvent.ACTION_MOVE:
           // 移动
           break;
      
       case MotionEvent.ACTION_UP:
           // 抬起
           mLastY = (int) event.getRawY();
           if (canLoad()) {
               loadData();
           }
           break;
       default:
           break;
      

      }

      return super.dispatchTouchEvent(event); }

    /**

    • 是否可以加载更多, 条件是到了最底部, listview不在加载中, 且为上拉操作.
    • @return */ private boolean canLoad() { return isBottom() && !isLoading && isPullUp(); }

    /**

    • 判断是否到了最底部 */ private boolean isBottom() {

      if (mListView != null && mListView.getAdapter() != null) { return mListView.getLastVisiblePosition() == (mListView.getAdapter().getCount() - 1); } return false; }

    /**

    • 是否是上拉操作
    • @return */ private boolean isPullUp() { return (mYDown - mLastY) >= mTouchSlop; }

    /**

    • 如果到了最底部,而且是上拉操作.那么执行onLoad方法 */ private void loadData() { if (mOnLoadListener != null) { // 设置状态 setLoading(true); // mOnLoadListener.onLoad(); } }

    /**

    • @param loading */ public void setLoading(boolean loading) { isLoading = loading; if (isLoading) { mListView.addFooterView(mListViewFooter); } else { try { mListView.removeFooterView(mListViewFooter); mYDown = 0; mLastY = 0; } catch (Exception e) {

       }
      

      } }

    /**

    • @param scrollListener */ public void setOnScrollListener(OnScrollListener scrollListener) { this.mOnScrollListener = scrollListener; }

    /**

    • @param loadListener */ public void setOnLoadListener(OnLoadListener loadListener) { mOnLoadListener = loadListener; }

    @Override public void onScrollStateChanged(AbsListView view, int scrollState) {

    }

    @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { if (null != mOnScrollListener) { mOnScrollListener.onScroll(view, firstVisibleItem, visibleItemCount, totalItemCount); } // 滚动时到了最底部也可以加载更多 if (canLoad()) { loadData(); } }

    /**

    • 加载更多的监听器
    • @author mrsimple */ public static interface OnLoadListener { public void onLoad(); }

    /**

    • 滑动事件的监听器
    • @author mrsimple */ public static interface OnScrollListener { public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount); } }

转载于:https://my.oschina.net/u/2483113/blog/1526807

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值