0

我有一个View应该处理触摸的容器。它具有Listviewwith overrided onTouch(),它返回falsetrue当容器通过滑动展开时它将返回)。当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返回false它的覆盖onTouch()吗?

4

2 回答 2

1

大约 2 周前我遇到了同样的问题。从 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。

于 2016-03-27T16:12:28.970 回答
1

如果您希望处理 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
        }
    });
于 2016-03-27T16:07:10.277 回答