天天看点

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)中实现就行了。

继续阅读