2016-08-23 1 views
0

참고 :이 특정 문제는 해결되었지만 심각한 후속 문제가 있습니다. 한 번보기 GestureDetector - Detect double click in GridView item's although returning false in onTouchEvent()GestureDetector가 GridView의 DoubleClick 제품을 감지합니다.

GridView 개 이미지의 개별 항목에 대해 더블 클릭을 감지하고 싶습니다. 따라서 getView() 어댑터의 각 항목 imageView에 별도의 OnTouchListener을 할당했습니다. gestureDetector은 어댑터 클래스의 멤버 변수입니다.

private GestureDetectorCompat gestureDetector; 

public ImageGridViewAdapter(Context c, ArrayList<UriWrapper> startUpImages)  { 
    mContext = c; 
    uriManager = new UriManager(startUpImages); 
    gestureDetector = new GestureDetectorCompat(mContext, new SingleTapConfirm()); 
} 

public View getView(final int position, View recycled, ViewGroup parent) { 

    ViewHolder holder; 
    if (recycled == null) { 
     ..... find items by id 
    } else{ 
     holder = (ViewHolder) recycled.getTag(); 
    } 

    // Set listener to item image 
    holder.image.setOnTouchListener(new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      // Always returns false, the gestureDetector does not detect anything 
      boolean ret = gestureDetector.onTouchEvent(event); 
      // At least the onTouch-callback gets called with the correct position 
      Log.e(TAG, "onTouch returned " + ret + " at position " + position); 
      return true; 
     } 
    }); 

    // Use glide library to load images into the image views 
    Glide.with(mContext)....into(holder.image); 
    return recycled; 
} 

개인 클래스 SingleTapConfirm는 GestureDetector.SimpleOnGestureListener {

@Override 
    public boolean onSingleTapConfirmed(MotionEvent event) { 
     Log.e(TAG, "onSingleTapConfirmed"); // never called.. 
     return true; 
    } 

    @Override 
    public boolean onDoubleTap(MotionEvent e) { 
     Log.e(TAG, "onDoubleTap"); // never called.. 
     return super.onDoubleTap(e); 
    } 
} 

OnTouchListener의 작업과 정확한 위치와 전화를받을를 확장합니다. 그러나 내가하고있는 것에 상관없이 GestureDetector의 메서드는 호출되지 않습니다. 이 코드의 문제점은 무엇입니까?

업데이트 : onTouch 콜백은 true를 반환해야합니다. 적어도 이제는 GestureDetector가 작동합니다. 그러나, 길게 클릭 선택 모드 및 내 GridView에 대한 전역 OnTouchListener가 있기 때문에 true를 반환하면 나머지 기능이 중단됩니다.

두 번째 업데이트 : 항목 별 OnTouchListener와 전역 OnTouchListener를 병합하면 제대로 작동하지 않습니다. (특정 항목에서만 인식되는 스 와이프 동작) ImageView를 확장하는 사용자 지정보기를 만들고 항목 별 OnTouchListener를 할당하여이 두 가지 문제를 해결할 수 있기를 바랍니다.

+1

확인이 링크 : http://stackoverflow.com/questions/2217670/android-how-to-detect-double-tap 나는 그것을 변경 – prakash

답변

1
private GestureDetectorCompat gestureDetector; 

    // in your adapter constructor 
    gestureDetector = new GestureDetector(context, new SingleTapConfirm()); 

    public View getView(final int position, View recycled, ViewGroup parent) { 

     ViewHolder holder; 
     if (recycled == null) { 
      .....find items by id 
     } else { 
      holder = (ViewHolder) recycled.getTag(); 
     } 

     // Set listener to item image 
     holder.image.setOnTouchListener(new View.OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       // Use lazy initialization for the gestureDetector 
       gestureDetector.onTouchEvent(event); 
       // At least the onTouch-callback gets called with the correct position 
       return true; 
      } 
     }); 

     // Use glide library to load images into the image views 
     Glide.with(mContext)....into(holder.image); 
     return recycled; 
    } 

    private class SingleTapConfirm extends GestureDetector.SimpleOnGestureListener { 

     @Override 
     public boolean onSingleTapConfirmed(MotionEvent event) { 
      Log.e(TAG, "onSingleTapConfirmed"); // never called.. 
      return true; 
     } 

     @Override 
     public boolean onDoubleTap(MotionEvent e) { 
      Log.e(TAG, "onDoubleTap"); // never called.. 
      return super.onDoubleTap(e); 
     } 
    } 

업데이트 :

 @Override 
     public boolean onTouch(View v, MotionEvent event) {anything 
      gestureDetector.onTouchEvent(event); 
      return true; 
     } 
+0

감사 이 내부 클래스를 사용하여 지연 초기화를 제거했지만 여전히 제스처를 감지하지 못합니다 – Mike76

+1

생성자를 사용하여 질문에 업데이트 된 코드를 게시 할 수 있습니까? –

+0

예 코드를 업데이트했습니다. – Mike76

관련 문제