Android使用ItemTouchHelper打造可拖拽的RecyclerView

前言

ItemTouchHelper是support v7包提供的处理关于在RecyclerView上添加拖动排序与滑动删除的非常强大的工具类。它是RecyclerView.ItemDecoration的子类,也就是说它可以轻易的添加到几乎所有的LayoutManager和Adapter中。下面来看一下它的基本用法,然后使用ItemTouchHelper来仿大部分新闻客户端频道的添加删除的一个实现!
下边demo的效果:
Android使用ItemTouchHelper打造可拖拽的RecyclerView_第1张图片

简单使用

上边说了它是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.UPItemTouchHelper.DOWN两个方向
    • 如果是网格类型的,拖拽则有UPDOWNLEFTRIGHT四个方向

    另外,滑动方向列表类型的,有STARTEND两个方法,如果是网格类型的一般不设置支持滑动操作可以将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即可!

来张官方效果图:
Android使用ItemTouchHelper打造可拖拽的RecyclerView_第2张图片

好了,上边基本上就是关于ItemTouchHelper全部的基础内容了!

仿新闻APP频道添加删除

效果图就是文章开头展示的那样!
全部的实现就是一个RecyclerView和ItemTouchHelper的搭配!
下边说一下主要功能的基本实现:

①界面上4块内容,分别用4个不同itemType,即我的频道标题,我的频道内容,可添加频道标题,可添加频道标题内容。
②点击编辑按钮进入编辑模式,点击完成退出编辑模式。
③单击我的频道内容,弹出toast(可以定义跳转具体内容事件),单击可添加频道内容,将该频道添加到我的频道中,并在可添加中删除。
④长按我的频道内容,自动进入编辑模式,可以拖拽排序,单击删除并添加到可添加频道中。

好了,具体的代码就不再粘出来了,如果知道了上边讲解的具体的原理,还是很好理解的!

demo已上传到Github:xxxxxxxxx
需要的可以查看!

你可能感兴趣的:(Android学习笔记)