2014-11-14 90 views
2

在閱讀Jacob的解決方案RecyclerView onClick question後,我試圖擴展他的「雙擊」事件的解決方案。當我將recyclerview註冊到單擊和雙擊監聽器時,正確調用onDoubleClick(),但在用戶雙擊時也會調用onClick(),這是我想要避免的。我希望如果檢測到雙擊事件,就不會檢測到單擊事件。RecyclerView onDoubleClick和onClick

下面是我雙擊聽者改編自雅各布的解決方案的代碼:

public class RecyclerItemDoubleClickListener implements RecyclerView.OnItemTouchListener { 
    private OnItemDoubleClickListener doubleClickListener; 

    public interface OnItemDoubleClickListener { 
     public void onItemDoubleClick(View view, int position); 
    } 

    GestureDetector mGestureDetector; 

    public RecyclerItemDoubleClickListener(Context context, OnItemDoubleClickListener listener) { 
     doubleClickListener = listener; 
     mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() { 
      @Override public boolean onDoubleTap(MotionEvent e) { 
       return true; 
      } 
     }); 
    } 

    @Override public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) { 
     View childView = view.findChildViewUnder(e.getX(), e.getY()); 
     if (childView != null && doubleClickListener != null && mGestureDetector.onTouchEvent(e)) { 
      doubleClickListener.onItemDoubleClick(childView, view.getChildPosition(childView)); 
     } 
     return false; 
    } 

    @Override public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) { } 
} 

我簡單地註冊這樣的:

recyclerView.addOnItemTouchListener(new RecyclerItemDoubleClickListener(
      this, new RecyclerItemDoubleClickListener.OnItemDoubleClickListener() { 
     @Override 
     public void onItemDoubleClick(View view, int position) { 
      Toast.makeText(ActivityMain.this, "double click " + position, Toast.LENGTH_SHORT).show(); 
     } 
    })); 

    recyclerView.addOnItemTouchListener(new RecyclerItemClickListener(
      this, new RecyclerItemClickListener.OnItemClickListener() { 
     @Override 
     public void onItemClick(View view, int position) { 
      Toast.makeText(ActivityMain.this, "single click " + position, Toast.LENGTH_SHORT).show(); 
     } 
    })); 

你會如何處理? PS:我也想單獨檢測同一個recyclerview項目上的「longClick」,「向左滑動」,「向右滑動」。但我想這可能太多,我自己編碼。我會等待圖書館或谷歌提供它。

回答

2

使用onSingleTapConfirmed()GestureListener的方法區分singleTap和DoubleTap。

http://developer.android.com/reference/android/view/GestureDetector.SimpleOnGestureListener.html#onSingleTapConfirmed%28android.view.MotionEvent%29

要檢測向左滑動和GestureListener

使用權onFling()內onFling使用下面的代碼

if(motionEvent.getX() - motionEvent.getX() > SWIPE_MIN_DISTANCE) { onSwipeRightToLeft(); } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE) { onSwipeLeftToRight(); }

0

可以使用ItemTouchHelper添加滑動將其關閉並拖動&放棄對RecyclerView的支持。