RecyclerView 作为ListView、GridView的替代品,从它诞生开始就如火如荼,很多基于其改造的刷新、header控件应运而生,今天我们的主角是拖拽与删除效果,很多关于ListView拖拽、侧滑菜单的控件可能并不能移植到RecyclerView上,但作为继承物怎么能不支持拖拽与侧滑呢?
ItemTouchHelper便是一个用于处理RecyclerView拖拽与滑动删除的强大工具,可以轻而易举的支持几乎所有LayoutManager,并且支持item的动画等等。ItemTouchHelper在使用上也是非常的简单的,只需要新建ItemTouchHelper实例,然后attachToRecyclerView就可以了,是不是相当容易。
- ItemTouchHelperCallback是我们自定义用于拖拽、删除的回调接口
- getMovementFlags指定支持拖拽、滑动的方向,使用helperItemTouchHelper.makeMovementFlags(int, int)来构造返回的flag
- onMove是拖拽的方法
- onSwiped是删除的方法
- isLongPressDragEnabled是否支持拖拽,默认true
- isItemViewSwipeEnabled是否支持滑动删除,默认true
- onSelectedChanged选中item时的方法,这里我们以示区别改变了背景
- clearView完成时的方法,这里我们把背景改成了透明
然后只需要简单的如下操作便可以了
效果如下

如果我们仅仅只是需要拖拽或者滑动删除大可不必继承ItemTouchHelper.Callback而继承ItemTouchHelper.SimpleCallback实现构造、onMove与onSwiped即可
比如我们有这个的需求并不是所有的item都支持拖拽与删除,那我们需要做一些改变,将 isLongPressDragEnabled,isItemViewSwipeEnabled返回false。
然后我们需要监听item的长按事件,再判断是否有拖拽、删除功能,最后手动调用 touchHelper.startDrag(ViewHolder viewHolder)和touchHelper.startSwipe(ViewHolder viewHolder)实现效果。
这里RecyclerView的事件使用liaoinstan的介绍的OnItemTouchListener事件完成。
我们添加了三个抽象方法,用单击、长按、侧滑的回调,然后通过监听手势动作,调用相应的方法,然后我们把下面两个方法返回FALSE
最后给RecyclerView添加事件
这样我们可以通过条件判断手动调用拖拽与侧滑的方(这里直接调用了,我们可以根据实际情况添加判断)。
到这里ItemTouchHelper关于拖拽与侧滑的操作基本完成,当然我们还可以覆盖着两个方法
添加一些交互的动画,让操作更人性化,例如侧滑删除时改变item的透明度、或者添加滑动删除的提示,拖拽时添加长按下去的动画等等。更多操作请查看https://github.com/iPaulPro/Android-ItemTouchHelper-Demo