ItemTouchHelper是support v7包提供的处理关于在RecyclerView上添加拖动排序与滑动删除的非常强大的工具类。它是RecyclerView.ItemDecoration的子类,也就是说它可以轻易的添加到几乎所有的LayoutManager和Adapter中。下面来看一下它的基本用法,然后使用ItemTouchHelper来仿大部分新闻客户端频道的添加删除的一个实现! 下边demo的效果:
上边说了它是RecyclerView.ItemDecoration的子类,所以使用前我们要先添加RecyclerView依赖:
compile 'com.android.support:recyclerview-v7:25.3.1'然后要使用ItemTouchHelper,要自己继承ItemTouchHelper.Callback这个抽象类,来监听move或者swipe的事件!官方已经提供了一个SimpleCallback,可以直接使用。
下边我们来具体说一下ItemTouchHelper.Callback这个抽象类! 首先是3个比较重要的回调方法:
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction)getMovementFlags() 用于设置是否处理拖拽事件和滑动事件,以及拖拽和滑动操作的方向,有以下两种情况:
如果是列表类型的,拖拽只有ItemTouchHelper.UP、ItemTouchHelper.DOWN两个方向如果是网格类型的,拖拽则有UP、DOWN、LEFT、RIGHT四个方向另外,滑动方向列表类型的,有START和END两个方法,如果是网格类型的一般不设置支持滑动操作可以将swipeFlags = 0置为0,表示不支持滑动操作! 最后,需要调用return makeMovementFlags(dragFlags, swipeFlags);将设置的标志位return回去!
onMove() 如果我们设置了相关的dragFlags ,那么当我们长按item的时候就会进入拖拽并在拖拽过程中不断回调onMove()方法,我们就在这个方法里获取当前拖拽的item和已经被拖拽到所处位置的item的ViewHolder。
onSwipe() 如果我们设置了相关的swipeFlags,那么当我们滑动item的时候就会调用onSwipe()方法,一般的话在使用LinearLayoutManager的时候,在这个方法里可以删除item,来实现滑动删除!
另外还有两个控制是否开启拖拽或者滑动的方法:
//开启长按拖拽功能,默认为true //如果设置为false,手动开启,调用startDrag() @Override public boolean isLongPressDragEnabled() { return true; } //开始滑动功能,默认为true //如果设置为false,手动开启,调用startSwipe() @Override public boolean isItemViewSwipeEnabled() { return true; }就是说,如果我们不重写这两个方法,那么拖拽和滑动都是默认开启的,如果需要我们自定义拖拽和滑动,可以设置为false,然后调用startDrag()和startSwipe()方法来开启!
还有两个方法,可以使用户交互更加友好: ①
public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState)这个方法在选中Item的时候(拖拽或者滑动开始的时候)调用,通常这个方法里我们可以改变选中item的背景颜色等,高亮表示选中来提高用户体验。 需要注意的是,这里的第二个参数int actionState,它有以下3个值,分别表示3种状态:
ACTION_STATE_IDLE:闲置状态ACTION_STATE_SWIPE:滑动状态ACTION_STATE_DRAG:拖拽状态我们可以根据这个状态值,作不同的逻辑处理! ②
public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder)这个方法在当手指松开的时候(拖拽或滑动完成的时候)调用,这时候我们可以将item恢复为原来的状态。
最后在代码中:
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(new SimpleItemTouchCallback(data, adapter)); itemTouchHelper.attachToRecyclerView(recyclerView);先得到ItemTouchHelper 实例,构造方法中传入我们自定义的Callback,然后调用attachToRecyclerView(recyclerView),传入需要绑定的RecyclerView即可!
来张官方效果图:
好了,上边基本上就是关于ItemTouchHelper全部的基础内容了!
效果图就是文章开头展示的那样! 全部的实现就是一个RecyclerView和ItemTouchHelper的搭配! 下边说一下主要功能的基本实现:
①界面上4块内容,分别用4个不同itemType,即我的频道标题,我的频道内容,可添加频道标题,可添加频道标题内容。 ②点击编辑按钮进入编辑模式,点击完成退出编辑模式。 ③单击我的频道内容,弹出toast(可以定义跳转具体内容事件),单击可添加频道内容,将该频道添加到我的频道中,并在可添加中删除。 ④长按我的频道内容,自动进入编辑模式,可以拖拽排序,单击删除并添加到可添加频道中。
好了,具体的代码就不再粘出来了,如果知道了上边讲解的具体的原理,还是很好理解的!
demo已上传到Github:xxxxxxxxx 需要的可以查看!