前言
RecyclerView的Item删除功能是一个十分常见的功能。这不我的项目中也有了这种需求!为避免重复造轮子,第一件事就是GitHub搜索SwipeLayout,本文是在 https://github.com/fornana/swipeitemlayout 的基础上实现的。
做了哪些事情
fornana的swipeitemlayout已经实现了侧滑显示更多按钮的功能,我对其做了以下修改:
- 修改列表Item的点击事件处理;
- 增加Item删除确认功能;
分析开源代码增加点击事件
swipeitemlayout是单一的功能实现类,分析源码的策略是先应用到项目中测试,在遇到问题时分析源码解决(对于一个复杂的开源实现分析时其实有一些小技巧,在后续文章中会进行介绍)。
将swipeitemlayout应用到项目中的列表中,侧滑功能未发现问题。但在点击item时不能触发点击事件,我们分析源码看看如何解决这个问题:
-
方法onInterceptTouchEvent
触摸拦截判断 -
方法onTouchEvent
触摸事件
从截图中看出布局View的触摸事件被重写了,但没有实现点击功能。我们要做的就是添加点击功能,可能的实现方式包括:
- 通过逻辑在重写的Touch方法中区分是处于可单击状态(侧滑没有打开,且发生短时间按下和松开)
-
直接给mMainView(参见下图代码,实际就是我们每个展示的Item内容布局)添加点击事件,当触摸事件不被阻拦时触发mMainView的点击事件
子view
明显方法二要在逻辑上要简单一点,缺点是我们要每次要外部获取到这个mMainView然后添加点击事件,对于实际作为Recyclerview的item时,是不是可以直接设置ItemView的点击事件就可以,有简化的方法呢?其实在mMainView点击时调用SwipeItemLayout的点击事件就很容易解决这个问题:
点击
分析源码增加删除确认功能
该功能需要注意两点:
- 点击侧滑菜单删除按钮时滑动显示确认提示
- 点击非提示部分及滑动隐藏侧滑菜单时关闭提示
要增加删除确认功能,首先要添加一个默认隐藏的确认View:
*首先在 ids.xml 增加id,方便外部集成
增加提示id
-
在侧滑布局类中获取确认View:
获取提示View -
接下来实现第一点功能,很简单,增加一个显示确认提示的动画的公开方法即可:
显示提示 -
第二点需要在分析在什么源码,确定哪些情况会关闭侧滑菜单。具体操作后确定三种情况
- 触摸非当前显示的Item位置
- 点击当前Item的非侧滑菜单位置
- 缓慢或快速滑动当前Item关闭侧滑菜单
前两个可以视为一种情况,都是一次性关闭,第二种是根据触摸位置关闭。这里不再详细分析如何找到对应位置,不是很难找。直接上代码:
直接关闭 滑动关闭
效果图
侧滑菜单 删确认集成
将你的Item布局改成如下图,包含你当前Item布局和菜单(通常是LinearLayout)
image.png
然后添加点击时showTip()和Item点击事件即可
网友评论