當前位置:編程學習大全網 - 源碼下載 - recyclerview 怎麽才能左右滑動

recyclerview 怎麽才能左右滑動

關於RecyclerView.OnItemTouchListener的幾個方法我也學習了下也不是很難主要是攔截與操作這兩個東西壹定要配合好,還有就是RecyclerView的滾動狀態,因為在RecyclerVIew滾動的時候我們的滑動菜單是不能操作的不然就會產生混亂,在項目開發的時候由於我的Item是有onClick事件的,那麽在用戶滑出菜單的時候也要把onClick事件給攔截但是又不能攔截菜單的Onclick事件我是通過容器的rect與scrollX的偏移來解決這個問題的可以看源碼就知道呢。下面是攔截代碼。

@Override

public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {

if(!mCallback.isEnable())

return false;

int action = MotionEventCompat.getActionMasked(e);

int x = (int) e.getX();

int y = (int) e.getY();

/*

* 當我們沒有發生drag事件的時候cancel或up事件會發生interceptTouchEvent裏面,如果TargetView等於空的時候直接

* 返回false,不攔截事件

* */

if(action == MotionEvent.ACTION_CANCEL || action == MotionEvent.ACTION_UP)

if(mTargetView == null)

return false;

boolean needIntercept = false;

switch (action) {

case MotionEvent.ACTION_DOWN:

mActivePointerId = MotionEventCompat.getPointerId(e, 0);

mLastX = (int) e.getX();

mLastY = (int) e.getY();

//查找需要顯示菜單的view;

mTargetView = mCallback.findTargetView(x, y);

/*

* 如果正在動畫則攔截事件

* */

if (mExpandAndCollapseAnim != null) {

//mExpandAndCollapseAnim.cancel();

mExpandAndCollapseAnim = null;

needIntercept = true;

}

break;

case MotionEvent.ACTION_MOVE:

int deltaX = (x - mLastX);

int deltaY = (y - mLastY);

if(Math.abs(deltaY) > Math.abs(deltaX))

return false;

//如果移動距離達到要求,則攔截

needIntercept = mIsDragging = mTargetView != null && Math.abs(deltaX) >= mTouchSlop;

break;

case MotionEvent.ACTION_CANCEL:

case MotionEvent.ACTION_UP:

/*

* 當壹個up事件發生在正常的範圍內且scrollX等於scrollRange則折疊view並攔截UP事件

* 防止view響應點擊事件

* */

if(isExpanded()){

if (inView(x, y)) {

//攔截事件,防止targetView執行onClick事件

needIntercept = true;

}else{

//如果走這那行這個ACTION_UP的事件會發生在右側的菜單中

}

//折疊菜單

mTargetView.setScrollX(0);

}

dispatchCollapsedOrExpanded();

break;

}

return needIntercept && mTargetView != null;

}

  • 上一篇:蘭州源代碼建設站
  • 下一篇:2020獎勵平臺源代碼
  • copyright 2024編程學習大全網