ItemTouchHelper源码解析
2016-06-23 15:25
459 查看
ItemTouchHelper源码解析
相关知识点
android.support.v7.widget.helper.ItemTouchHelperRecyclerView&ItemTouchHelper
核心内容
这个帮助类的主要作用就是帮助RecyclerView实现滑动消失和拖拽支持的,他是RecyclerView高度解耦的一部分,通过内部静态类Callback(回调机制)与RecyclerView进行通信,主要作用就是监听用户执行的手势行为。根据我们想要支持监听的行为,我们应该是想对应的方法,比如:监听移动onMove(RecyclerView, ViewHolder, ViewHolder)}监听滑动: Callback#onSwiped(ViewHolder, int)
这个类可以与RecyclerView的任何一种LayoutManager结合使用,也可以与我们自己定义的LayoutManager联合使用,但是我们需要通过实现Callback或者ViewDropHanlder的方式达到目的。
关于版本的问题,默认的ItemTouchHelper在3.1版本之前来执行item X/Y移动不是通过属性动画,而是通过控制来布局的显示隐藏来实现的,我们也可以通过onChildDraw(Canvas, cyclerView, ViewHolder, float, float, int, boolean)或者onChildDrawOver方法即可,一般在3.1版本之后只需要重写onChildDraw即可。
核心方法
public ItemTouchHelper(Callback callback) 用自己定义的回调借口初始化该类对象public void attachToRecyclerView(RecyclerView recyclerView)将类对象与 RecyclerView绑定,自动过滤重复绑定、如果重新绑定recyclerview清楚之前的callback对象,重新设置新的callback属性
在这里面你还会看到我们经常用来设置间隔线的ItemDector类,因为ItemTouchHelper实现了该接口
public void startDrag(ViewHolder viewHolder)可以单独启动某个holder的推拽,与这个类似的还有:public void startSwipe(ViewHolder viewHolder)
核心方法之内部类CallBack
public static int makeMovementFlags(int dragFlags, int swipeFlags)可以设置滑动或者推拽消失的方向public abstract boolean onMove(RecyclerView recyclerView, ViewHolder viewHolder, ViewHolder target);可以将item的位置放到新位置的回调,成功返回true,不支持则该方法不会被调用
public abstract void onSwiped(ViewHolder viewHolder, int direction)此方法是滑动删除某一项回调,如果不支持则不会被调用,当被滑动的holder从recyclerviewdetached之后会调用 clearView(RecyclerView, ViewHolder),其中direction代表的是拖拽的方向,你个可以根据方向做相应的处理
public void onSelectedChanged(ViewHolder viewHolder, int actionState)在swiped或者dragged时调用,重写该方必须实现他父类的实现
public void clearView(RecyclerView recyclerView, ViewHolder viewHolder)当用户交互或者动画执行完成会调用该方法,清理view的改变(比如缩放、透明度、位置等)更好的方式是在onSelectedChanged\onCHildDraw\onChildDrawover中处理。
public void onChildDraw(Canvas c, RecyclerView recyclerView, ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive)重写这个方法我们可以自定义与用户的交互,当用户触发了RecyclerView.onDraw方法,这里系统默认提供的是对dx和dy的唯一操作,在L之后的版本还会对视图的高度(海拔)做出响应的优化
系统还提供了一个简单的CallBack实现类SimpleCallback,在这里用户只需要关心onDraw和onSwipe的操作即可
当然系统还提供了关于方法的处理类:private class RecoverAnimation implements AnimatorListenerCompat,其中还包含一些其他的几个方法,但是这里点到方法足够你实现强大的列表功能和效果了。
总结
如果要实现简单的效果使用SimpleCallBack重写onMove和onSwipe方法即可如果实现的功能不只是拖拽,如果还包括其他特效要求那就直接集成CallBack吧
在实现复杂功能的时候出去,必要的推拽回调onMove和onSwipe之外,你可能还需要续写onSelectedChanged、clearView、onChildDraw等等方法
注意跟进Android最新SDK支持哦
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories