要实现这样的一个功能:
一个ListView,能向左滑动出现删除按钮,点击item进入详情,长按item进入编辑
也就是说要做到滑动、点击、长按三个动作互不干扰,滑动时间长了不能触发长按,滑动后手松开不能触发点击。
刚开始我用的方法是:
item的view复写onTouchEvent + item setOnItemClickListener + item setOnItemLongClickListener,
结果滑动、点击、长按三个动作出现了冲突,滑动过程时间长了一定会触发长按事件,滑动结束后一定会触发点击事件。
网上的方法大多数是计算滑动过程的距离、时间,比如距离超过一定数值onTouchEvent 就return true,屏蔽掉点击和长按事件。
这种方法实际不可行,长按是在ACTION_MOVE中触发的,点击是在ACTION_UP后触发的,想同时完美无缺的屏蔽太难了。
完美的解决方案是:
在adapter的getView里,为item的view setOnTouchListener,在onTouch中把event作为参数传给item view的方法处理,同时也传给gestureDetector:
item.slideView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
mFlingListener.setItem(item);
item.slideView.deliverTouchEvent(event);
return mGestureDetector.onTouchEvent(event);
}
});
滑动事件的实现在view的方法(deliverTouchEvent)中实现就行了。