首页 文章

GestureDetector检测GridView项目上的DoubleClick

提问于
浏览
0

Note: 这个具体问题已经解决,但存在严重的后续问题 . 看看GestureDetector - Detect double click in GridView item's although returning false in onTouchEvent()

我想检测 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 的方法 . 这段代码似乎有什么问题?

Update :onTouch-callback需要返回true,现在至少GestureDetector工作 . 但是,返回true会破坏其余的功能,因为我有一个长按选择模式和一个用于我的GridView的全局OnTouchListener .

Second Update: 合并特定于项目的OnTouchListener和全局OnTouchListener无法正常工作 . (滑动手势仅在某些项目上识别)我希望通过创建自定义View扩展ImageView并在那里分配特定于项目的OnTouchListener,我可以解决这两个问题 .

1 回答

  • 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);
            }
        }
    

    Update:

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

相关问题