Android使用ItemTouchHelper打造可拖拽的RecyclerView

前言

最近涉及到一个关于班级学生座位的项目,需求是教师长按item可以根据学生的对座位进行拖拽更换位置,这个需求与今日头条等新闻app中的拖拽或者删除频道选项类似。通过百度一番,发现recyclerView还有一个ItemTouchHelper的东东。不得不说,recyclerView确实强大,于是,找了一个个人认为写的比较好的帖子,和大家一起分享一下。
ItemTouchHelper是support v7包提供的处理关于在RecyclerView上添加拖动排序与滑动删除的非常强大的工具类。它是RecyclerView.ItemDecoration的子类,也就是说它可以轻易的添加到几乎所有的LayoutManager和Adapter中。下面来看一下它的基本用法,然后使用ItemTouchHelper来仿大部分新闻客户端频道的添加删除的一个实现!
下边demo的效果:
在这里插入图片描述

简单使用

上边说了它是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.UP、ItemTouchHelper.DOWN两个方向
如果是网格类型的,拖拽则有UP、DOWN、LEFT、RIGHT四个方向
另外,滑动方向列表类型的,有START和END两个方法,如果是网格类型的一般不设置支持滑动操作可以将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()方法来开启!

还有两个方法,可以使用户交互更加友好:
1)

public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState)

这个方法在选中Item的时候(拖拽或者滑动开始的时候)调用,通常这个方法里我们可以改变选中item的背景颜色等,高亮表示选中来提高用户体验。

需要注意的是,这里的第二个参数int actionState,它有以下3个值,分别表示3种状态:

ACTION_STATE_IDLE:闲置状态

ACTION_STATE_SWIPE:滑动状态

ACTION_STATE_DRAG:拖拽状态

我们可以根据这个状态值,作不同的逻辑处理!
2)

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即可!

来张官方效果图:
在这里插入图片描述

原文转载地址:https://blog.csdn.net/aiynmimi/article/details/77744610

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值