先给大家展示下大概效果图:
Android上面有许多的教程,库和示例,在RecyclerView上面实现“拖放”和“滑动删除“功能。尽管有更新,更好的方法可用,但是大多数人依然使用旧的观点。OnDragListener和罗马Nurik的SwipeToDismiss方式。除了经常使用GestureDetector和onInterceptTouchEvent之外,几乎很少有人使用新的API,要不然的话,实现就复杂。事实上真的有十分简单的方式在RecyclerView上面添加这两个功能。它只要求一个类,而且这个类已经是Android支持包的一部分。
ItemTouchHelper
ItemTouchHelper是一个强大的通用程序,在RecyclerView上面添加“拖放”和“滑动删除”时,你所需要做的所有事情,它都会负责处理。它是RecyclerView。ItemDecoration的子类,这意味着它可以轻易地添加到任何已经存在的LayoutManager和适配器上面!它不会影响添加到项目上的动画,并且支持类别严格的“拖”,以及“放”时的动画,还可以支持更多。
首先,我们所需要的是添加RecyclerView的依赖:
编译“com.android.support: recyclerview-v7:25.3.0”
为了使用ItemTouchHelper,你将创建一个ItemTouchHelper。回调,这是一个接口,允许你监听“移动”和“刷卡”事件,而且你可以通过调来控件已选中视图的状态,并且可以改变该视图的默认动画。如果只是想要一个基础实现,你可以使用SimpleCallback这个帮助类,但是为了学习回调的工作原理,我们将会自己实现一个。
为了激活基本的“拖放”和“滑动删除”,我们必须覆盖的主要方法是:
getMovementFlags (RecyclerView ViewHolder) onMove (RecyclerView ViewHolder ViewHolder) onswipe (ViewHolder int)
我们也要使用这两个方法:
isLongPressDragEnabled () isItemViewSwipeEnabled ()
我们一个一个地看一下:
@Override 公共int getMovementFlags (RecyclerView RecyclerView, RecyclerView。ViewHolder ViewHolder) { int dragFlags=ItemTouchHelper。起| ItemTouchHelper.DOWN; int swipeFlags=ItemTouchHelper。开始| ItemTouchHelper.END; 返回makeMovementFlags (dragFlags swipeFlags); }
ItemTouchHelper允许你轻易地决定事件的方向。你必须实现getMovementFlags (RecyclerView RecyclerView.ViewHolder)方法来指明“拖”和“滑动”所支持的方向,并且使用ItemTouchHelper。makeMovementFlags (int, int)来构建返回标签。在此我们在两个不同的方向激活“拖”和“滑动”。
@Override 公共布尔isLongPressDragEnabled () { 返回true; }
ItemTouchHelper能够用来实现“没有滑动的拖动”或者”没有拖动的滑动”,所以你必须精确地指明想要支持的动作。如果你想要在RecyclerView的项上支持“长按启动拖放”事件,你就必须实现isLongPressDragEnabled()返回现实。此外,ItemTouchHelper.startDrag (RecyclerView.ViewHolder)可以从“操”作中启动“拖放”,这一点会在之后详述。
@Override 公共布尔isItemViewSwipeEnabled () { 返回true; }
要想要的视图内部的任意触摸事件都可以启动“滑动”动作,就简单地在isItemViewSwipeEnabled()返回现实。此外,ItemTouchHelper.startSwipe (RecyclerView.ViewHolder)能够手动地启动“滑动”事件。
然后,>
公共接口ItemTouchHelperAdapter {
空白>
公开课RecyclerListAdapter延伸
RecyclerView.Adapter 然后覆盖剩下的事件并通知适配器:
@Override
公共布尔>
公共类SimpleItemTouchHelperCallback ItemTouchHelper延伸。回调{
私人最终ItemTouchHelperAdapter mAdapter;
公共SimpleItemTouchHelperCallback (ItemTouchHelperAdapter适配器){
mAdapter=适配器;
}
@Override
公共布尔isLongPressDragEnabled () {
返回true;
}
@Override
公共布尔isItemViewSwipeEnabled () {
返回true;
}
@Override
公共int getMovementFlags (RecyclerView RecyclerView ViewHolder ViewHolder) {
int dragFlags=ItemTouchHelper。起| ItemTouchHelper.DOWN;
int swipeFlags=ItemTouchHelper。开始| ItemTouchHelper.END;
返回makeMovementFlags (dragFlags swipeFlags);
}
@Override
公共布尔>
ItemTouchHelper。回调函数回调=新SimpleItemTouchHelperCallback(适配器);
ItemTouchHelper touchHelper=new ItemTouchHelper(回调);
touchHelper.attachToRecyclerView (recyclerView);
安卓一步步带你在RecyclerView上面实现“拖放”和“滑动删除“功能