一 ItemTouchHelper
- android.support.v7.widget.helper.ItemTouchHelper
- 这是一个用来支持RecyclerView添加滑动消失、拖拽和退出的工具类
- 和RecyclerView、Callback一起使用;当配置了什么类型,用户执行这些类型的操作时,就会有相应的回调
- 主要方法:
Callback#onMove(RecyclerView, ViewHolder, ViewHolder)}
控制上下滑动
Callback#onSwiped(ViewHolder, int)} 控制左右滑动 - ItemTouchHelper可以和任意的LayoutManager一起工作;可以拓展ItemTouchHelper.Callback或者实现ItemTouchHelper.ViewDropHandler
- 默认情况下,ItemTouchHelper会通过translateX/Y属性来移动item,你可以重写Callback#onChildDraw()或者Callback#onChildDrawOver(),大多数情况下你只需要重写onChildDraw()
二 列表滑动删除、移动换位效果
1 效果图
2 需求
- 列表动态展示数据
- 列表item可左右滑动删除当前项
- 选中item特定view或者长按item,可以移动并改变当前item在整个list中的位置
3 需求分析
-
RecyclerView实现动态列表效果
-
ItemTouchHelper设置每个item的响应手势方向,并获取响应手势和数据的要素
-
相应的动画分两类:
上下移动,move 和 左右侧滑 swipe -
手指没有和屏幕分离
ItemTouchUIUtilImpl.draw(); -
手指和屏幕分离
RecoverAnimation -
猜想 MotionEvent.ACTION_MOVE 干了什么? 移动view!计算滑动距离
mRecyclerView.invalidate(); 触发 onDraw
4 Demo
三 ItemTouchHelper拓展
1 效果图
2 需求
- 动态列表左滑删除效果
- 列表左滑后显示不同布局
- 显示的布局可以单独设置点击事件
3 需求分析
为什么onclick 事件没有发送上来?
原因:事件被消费了
解决方案:
- 自定义onclick 的传递
- 销毁动画的实现
5 Demo
6 注意
- 常见的效果可以直接设置,但是在动态item和设置不同背景时,ItemTouchHelper的事件处理方法是私有的,相应事件、Canvas、坐标无法获取,这里可以直接简单的将v4包中的ItemTouchHelper代码拷贝出来,自定义一个ItemTouchHelper来替换系统的ItemTouchHelper
- RecyclerView的ItemDecoration 不是分割线,它可以设置分割线效果
- Demo中的v4包没有animation子包(不同的v4包),所以拷贝了该包到项目中去了