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)中實現就行了。

發佈了27 篇原創文章 · 獲贊 22 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章