在看了gouyuhua2008的高仿微信对话列表滑动删除效果后,记录下大致的思路。
大概一年半以前有不少app加入了列表项左滑删除的功能,个人觉得这个功能很不错,就试着去写个demo实现了一下。
回忆了一下当时实现的过程,步骤主要有三:
1.重写ListView的拦截事件,在move处判断是左右移动,上下移动,还是点击范围内的移动。判断是上下移动就拦截,否则不拦截,让ItemView去处理事件。
2.在ItemView的OnTouchEvent里处理左右滑动和点击范围内的移动,在Up的时候判断是点击范围内移动则当点击事件处理。
3.通过scroller处理左右滑动,并且在点击的时候回调点击事件。
在看了一篇博客后,发现一个新思路。
整个过程都是在ListView的onTouchEvent中完成的,所以也不需要去解决什么滑动冲突,而且逻辑很清晰,在ListView中改变了一个Item而已,ViewGroup对子View的改变一样,不涉及事件的分发。
blog代码地址:http://blog.youkuaiyun.com/gouyuhua2008/article/details/17584033
大概一年半以前有不少app加入了列表项左滑删除的功能,个人觉得这个功能很不错,就试着去写个demo实现了一下。
回忆了一下当时实现的过程,步骤主要有三:
1.重写ListView的拦截事件,在move处判断是左右移动,上下移动,还是点击范围内的移动。判断是上下移动就拦截,否则不拦截,让ItemView去处理事件。
2.在ItemView的OnTouchEvent里处理左右滑动和点击范围内的移动,在Up的时候判断是点击范围内移动则当点击事件处理。
3.通过scroller处理左右滑动,并且在点击的时候回调点击事件。
这样可以解决ListView和ItemView的滑动,并且可以处理单击事件。
但是这样有一个很大的弊端,就是单击事件我是通过在move的时候move的dx和dy很小,此时up我当作单击处理,但是在longClick的时候就得用更麻烦的逻辑去处理。
原因就是处理了滑动冲突,触摸事件被onTouchEvent里消费了,所以ItemView无法处理。在看了一篇博客后,发现一个新思路。
在ItemView实现一个public方法,后续被ListView调用。
就是所有的触摸事件全都交给ListView中的onTouchEvent去处理。在onTouchEvent通过pointToPosition(x, y)去获得item在列表的位置,但是这个动作需要之前就在adapter的数据对象里保存这个ItemView
整个过程都是在ListView的onTouchEvent中完成的,所以也不需要去解决什么滑动冲突,而且逻辑很清晰,在ListView中改变了一个Item而已,ViewGroup对子View的改变一样,不涉及事件的分发。
blog代码地址:http://blog.youkuaiyun.com/gouyuhua2008/article/details/17584033