赞
踩
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()
方法来开启!
还有两个方法,可以使用户交互更加友好:
①
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即可!
来张官方效果图:
好了,上边基本上就是关于ItemTouchHelper全部的基础内容了!
效果图就是文章开头展示的那样!
全部的实现就是一个RecyclerView和ItemTouchHelper的搭配!
下边说一下主要功能的基本实现:
①界面上4块内容,分别用4个不同itemType,即我的频道标题,我的频道内容,可添加频道标题,可添加频道标题内容。
②点击编辑按钮进入编辑模式,点击完成退出编辑模式。
③单击我的频道内容,弹出toast(可以定义跳转具体内容事件),单击可添加频道内容,将该频道添加到我的频道中,并在可添加中删除。
④长按我的频道内容,自动进入编辑模式,可以拖拽排序,单击删除并添加到可添加频道中。
好了,具体的代码就不再粘出来了,如果知道了上边讲解的具体的原理,还是很好理解的!
demo已上传到Github:xxxxxxxxx
需要的可以查看!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。