【问题标题】:GestureDetector detect DoubleClick on GridView itemsGestureDetector 检测 GridView 项目上的 DoubleClick
【发布时间】:2016-08-23 11:59:30
【问题描述】:

注意:这个具体问题已经解决了,但是有严重的后续问题。看看GestureDetector - Detect double click in GridView item's although returning false in onTouchEvent()

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

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-callback 需要返回 true,现在至少 GestureDetector 有效。但是,返回 true 会破坏其余功能,因为我的 GridView 有一个长按选择模式和一个全局 OnTouchListener。

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

【问题讨论】:

标签: java android gridview imageview gesture


【解决方案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;
        }

【讨论】:

  • 谢谢我改成使用这个内部类并去掉了惰性初始化,但是还是没有检测到任何手势
  • 你能用构造函数在你的问题中发布更新的代码吗?
  • 感谢手势检测器终于可以返回真了!但我仍然需要检查这是否会破坏我的其余代码
  • @Mike76 用勾号表示感谢并投票。
  • 您可以发布一个带有新问题的新问题,但首先要尽力而为,然后发布带有完整详细信息的新问题,您也可以在此处发送其链接作为参考快乐编码:) 如果您勾选它不会考虑未回答的问题,那么它也可以在这里其他新手。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-17
  • 2021-03-07
相关资源
最近更新 更多