天天看點

ListView的item實作滑動、點選、長按不沖突

要實作這樣的一個功能:

一個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);
            }
        });
           

gestureListener中的onSingleTapUp(點選)和onLongPress(長按)就不會跟滑動事件沖突了,

滑動事件的實作在view的方法(deliverTouchEvent)中實作就行了。

繼續閱讀