您的位置:首页 > 移动开发 > Android开发

ItemTouchHelper源码解析

2016-06-23 15:25 459 查看

ItemTouchHelper源码解析

相关知识点

android.support.v7.widget.helper.ItemTouchHelper

RecyclerView&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支持哦
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  开源 android 源码