ListView的item实现滑动、点击、长按不冲突
2016-03-23 19:47
260 查看
要实现这样的一个功能:
一个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:
gestureListener中的onSingleTapUp(点击)和onLongPress(长按)就不会跟滑动事件冲突了,
滑动事件的实现在view的方法(deliverTouchEvent)中实现就行了。
一个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)中实现就行了。
相关文章推荐
- 深刻:截获windows的消息并分析实例(DefWindowProc),以WM_NCHITTEST举例(Windows下每一个鼠标消息都是由 WM_NCHITTEST 消息产生的,这个消息的参数包含了鼠标位置的信息)
- 线程和进程的比较
- 关于"是否需要有代码规范"的个人看法
- 「学习笔记」3.23代码学习
- 华为OJ--小明的筷子
- java 获取两个时间相差天数
- ios使用常用正则表达式验证密码身份证手机号【转】
- Google推荐的图片加载库Glide介绍
- Ubuntu 14.04 文件服务器--samba的安装和配置
- 第4周项目5:用递归方法求解-求1*3*5*...*n的递归式
- 关于List接口的add()和set()方法
- 统计文件中的单词数、字符数和行数的程序
- 作业三:代码复审
- 作业三(2)
- maven build的常用生命周期
- ID为0和ID为1的进程
- struts2标签,整合其他大神博客
- Flyme3升级Flyme4固件损坏问题
- Python~list,tuple^_^dict,set
- 第三周项目4:穷举法解决组合问题(4)委派任务