在縱向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); }}以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。
新聞熱點
疑難解答