我有一个应该处理触摸的容器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。