我有自定义适配器的列表视图。每行都有一些文本和一个可点击的FrameLayout,其上设置了onClickListener。可以使用滑动删除行(例如gmail或环聊)。我正在使用Roman Nurik的SwipeToDismiss库。问题是可点击的FrameLayout占用了行的一半空间,因此很难将行滑开,因为它会消耗MOVE事件。
我已经读过,我可以通过扩展FrameLayout并覆盖dispatchTouchEvent方法将事件传递给父视图。我已尝试过,但随后所有事件都被传递,因此FrameLayout不再可点击。
我也试过这个:
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_MOVE) {
return false;
}
return super.dispatchTouchEvent(ev);
}
但看起来一旦视图“得到”了DOWN事件,就不会再将它传递给父级了。
我的问题: 我该怎么做,在当前视图上保留onClick事件,但是将MOVE事件传递给父视图?
答案 0 :(得分:3)
我得到了它的工作。我扩展了FrameLayout并重写了方法dispathTouchEvent:
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_MOVE) {
//if move event occurs
long downTime = SystemClock.uptimeMillis();
long eventTime = SystemClock.uptimeMillis() + 100;
float x = ev.getRawX();
float y = ev.getRawY();
int metaState = 0;
//create new motion event
MotionEvent motionEvent = MotionEvent.obtain(
downTime,
eventTime,
MotionEvent.ACTION_DOWN,
x,
y,
metaState
);
//I store a reference to listview in this layout
listview.dispatchTouchEvent(motionEvent); //send event to listview
return true;
}
return super.dispatchTouchEvent(ev);
}
现在FrameLayout是可点击的,但是在MOVE发生之后,它会创建一个新的MotionEvent并将其发送到ListView,在那里滚动或刷掉内容。我应该添加一些+ - 来MOVE事件,因为当你用手指按下时,你通常会用它做一些MOVE事件。