要實現這樣的一個功能:
一個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)中實現就行了。