2016-08-23 78 views
0

注意:解决了此特定问题,但存在严重的后续问题。看看GestureDetector - Detect double click in GridView item's although returning false in onTouchEvent()手势检测器检测DoubleClick on GridView项目

我想检测图像GridView中不同项目的双击。 因此,我在适配器的getView()方法中为每个项目imageView分配了一个单独的OnTouchListenergestureDetector是适配器类的成员变量。

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的作品。但是,返回true会打破其余的功能,因为我的GridView具有长按单选模式和全局OnTouchListener。

第二次更新: 合并特定于项目的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