安卓一步步带你在RecyclerView上面实现“拖放”和“滑动删除“功能

  

先给大家展示下大概效果图:

  

 Android一步步带你在RecyclerView上面实现“拖放”和“滑动删除“功能

  

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   实现ItemTouchHelperAdapter {//胗胍?   @Override   公共空间>   私人最终ItemTouchHelperAdapter mAdapter;   公共SimpleItemTouchHelperCallback (   ItemTouchHelperAdapter适配器){   mAdapter=适配器;   }      

然后覆盖剩下的事件并通知适配器:

        @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上面实现“拖放”和“滑动删除“功能