使用ItemTouchHelper实现RecyclerView的Swipe to Dismiss行为

  ItemTouchHelper是用来为RecyclerView添加Swipe to Dismiss和Drag & Drop行为的帮助类,使用它可以很方便地实现对RecyclerView中item的扫动和拖拽动作。

  ItemTouchHelper通过ItemTouchHelper.Callback和你的具体应用进行交互,ItemTouchHelper.Callback负责控制所希望使用的功能(扫动、拖拽),以及扫动和拖拽事件发生时的回调。ItemTouchHelper.SimpleCallback是对ItemTouchHelper.Callback的一个简单地封装,提供了扫动和拖拽的基本功能。

  使用ItemTouchHelper时,只需要提供ItemTouchHelper.Callback,然后把ItemTouchHelper关联到RecyclerView上即可,如实现扫动移除的功能如图1所示:

图1

 

这里使用了ItemTouchHelper.SimpleCallback, ItemTouchHelper.RIGHT 表示只支持向右扫动; isItemViewSwipeEnabled() 返回 true 表示启用扫动功能; onSwiped() 是扫动发生时的回调,可以通过 viewHolder.getAdapterPosition() 获得被扫动的item的位置, direction 为方向,这里从数据中移除对应元素后,使用 notifyItemRemoved() 通知adapter;这里不支持拖拽, onMove() 没有做实现。

  如果仅使用上面的代码,会发现item被扫动并移除后,下面的item会瞬间上移,填补被移除item的空间,为了美观,可以使用Animator来添加过渡动画效果,如:

虽然只是DefaultItemAnimator,当item被移除后,下面的item会慢慢上移,直到填补被移除item的空间。需要注意的是,要显示这种移除的动画效果,在移除数据后必须使用 notifyItemRemoved() 来通知adapter。上面的完整代码可以参考这里