如何在网格视图中获取点击,双击和长按手势?

时间:2013-07-25 17:34:59

标签: java android gridview onlongclicklistener gesturedetector

我在GridView中有ImageViews,我一直在使用OnItemClickListener以及GridView上设置的OnItemLongClickListener来打开较大页面上的图像并分别删除该项目。现在,我必须在GridView中实现ImageViews的重新排列,所以我打算将删除功能移动到双击手势,(请不要告诉我关于android风格的指导(包括上下文动作栏的可能性,我建议) ,因为这是我的老板要求模拟我们的ios应用程序内的功能),以保留拖放的长按。我在自定义适配器的getView中的每个视图上设置了一个OnTouchListener,为GestureDetecter提供了一个侦听器,该侦听器使用onTouchEvent扩展了给定MotionEvent的SimpleOnGestureListener。我知道到目前为止要做什么,但是当我在onDoubleTap,onSingleTapConfirmed和onLongPressed中包含(onDown当然要获得其他回调)时,所有的点击都被解释为长按。当我删除两个回调方法再次与他们的侦听器对应物(即OnItemClickListeners)时,我收到了这两个手势,但没有双击,这是有道理的,因为双击开始只需一次点击,除非你等待一个比不到一秒钟确认他们是单打而不是潜在的双打。我还尝试使用扩展的SimpleOnGestureListener中的回调放置OnItemClickListener,但不放置OnItemLongClickListener。在这种情况下,只有长按才被解释,但其他手势没有引起任何反应。这是我现在的代码,请注意我在onTouchEvent中返回false,以便允许其他人(itemclicklisteners)在GestureDetector中尝试后使用事件。

public class MainBoardGridAdapter extends GenericBoardGridAdapter implements OnItemLongClickListener {
    private class Ges extends GestureDetector.SimpleOnGestureListener {
        int pos;
        public Ges(View v) {
            pos = (Integer) v.getTag();
        }
        @Override
        public boolean onDown(MotionEvent me) {
            //this does get called but none of these methods below
            return true;
        }
        @Override
        public boolean onDoubleTap(MotionEvent me) {
            new DeleteConfirmationPrompt(c, "board") {
                @Override
                protected boolean onDeleteConfirmed() {
                    // delete the visionboard
                    return deleteBoard(pos);
                }
            }; // Constructor shows dialog
            return false;
        }
        @Override
        public boolean onSingleTapConfirmed(MotionEvent e) {
            MainBoardGridAdapter.super.flagForUpdate(pos);
            if (listener != null) {
                listener.onBoardClick(pos, getName(pos));
            } else {
                Intent intent = new Intent(c, VisionBoardActivity.class);
                intent.putExtra(VisionBoardActivity.EXTRA_VISION_BOARD_NAME, getName(pos));
                frag.startActivityForResult(intent, MyBoardsFragment.REQUEST_EDIT);
            }
            return false;
        }
    }


    @Override
    public boolean onItemLongClick(AdapterView<?> parent, View v,
        final int pos, long id) {
         Toast.makeText(c, "Long", Toast.LENGTH_LONG).show();
         return false;
    }
    // called by getView of extended adapter
    @Override
    public void onImageLoaded(ImageView iv, String data, View root) {
         iv.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
               (new GestureDetector(c, (new Ges(v)))).onTouchEvent(event);
                return false;
            }
         });
    }
}

在Activity中,gv是我的GridView:

gv.setOnItemLongClickListener(gridAdapter);

另请注意,我在GestureDetector方法的返回值中使用了true,直到尝试当前配置。没有任何区别可见。 感谢您宝贵的时间和帮助,我希望有人能够指出我做错了什么。

-Jackson

0 个答案:

没有答案