ListView中出现Android触摸事件



我有一个应该处理触摸的容器View。它有Listview和被覆盖的onTouch(),后者返回false(当容器通过滑动展开时,它将返回true)。当Listview触摸发生时,它传递到容器View,一切正常。但我需要为Listview的项目添加点击处理。

当我为项设置onClickListener时,我在日志中看到它没有传递到容器的MotionEvent,它被阻塞在ListView onTouch()中(返回false,什么也不做)。我正在尝试为以下项目设置onTouchListener

    viewHolder.itemLayout.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    return true;
                case MotionEvent.ACTION_MOVE:
                    return false;
                case MotionEvent.ACTION_UP:
                    Log.d(TAG, "something like click detected");
                    return true;
            }
            return false;
        }
    });

但结果是一样的。有人能解释一下为什么我的容器即使ListView为其被高估的onTouch()返回false也没有接收到触摸事件吗?

如果您希望处理ListView项目的点击:使用OnItemClickListener

    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            //parent.getItemAtPosition(position) returns the value of item clicked.. use it to do whatever you wish to do
        }
    });

大约两周前我也遇到了同样的问题。从listview的onTouch方法返回false并没有将事件传递给父容器。我最终这样做了:1.您需要为您的容器View自定义布局。然后在该视图中,覆盖onInterceptTouchEvent,例如:

@Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        switch  (ev.getAction()) {
            case MotionEvent.ACTION_DOWN:
                previousX_actionDOWN = ev.getRawX();
                isOnClick = true;
                timePressed = System.currentTimeMillis();
                return false;
            case MotionEvent.ACTION_MOVE:
                if (isOnClick && (Math.abs(previousX_actionDOWN - ev.getRawX()) > SCROLL_THRESHOLD)) {
                    return true;
                } else {
                    return false;
                }
            case MotionEvent.ACTION_UP:
                if (!wasDragged) {
                    return false;
                }
                else {
                    return true;
                }
        }
        return false;
    }

我在那个视图中也有复杂的onTouch方法,但不值得粘贴。重点是,只有在ACTION_MOVE期间通过了某个阈值时,您的父视图才应该拦截触摸事件——至少这是我想要实现的。然后在您的列表视图中,您只需实现标准的onItemClickListener,而不是onTouch。

最新更新