文章目录 一、ItemTouchHelper 简介 二、RecyclerView 相关资料 一、ItemTouchHelper 简介 ---- 官方文档 : https://developer.android.google.cn /reference/kotlin/androidx/recyclerview/widget/ItemTouchHelper ItemTouchHelper 可以为 RecyclerView 添加 滑动删除效果 和 拖动效果 ; ItemTouchHelper 需要与 RecyclerView 和 ItemTouchHelper.Callback 结合起来使用 ; 根据想要开发的功能 , 重写不同的方法 ; 如果是想要开发拖动效果相关的功能 , 重写 ItemTouchHelper.Callback 的 onMoved 方法 ; public abstract boolean onMove( 需要与 LayoutManager 布局管理器结合使用 ; 通过 继承 ItemTouchHelper.Callback 抽象类 , 或 实现 ItemTouchHelper.Callback 接口
ItemTouchHelper是谷歌提供的用于实现Recyclerview 拖拽效果的帮助类,今天我们来学习下它的基本用法 首先ItemTouchHelper需要实现它的一个内部抽象类CallBack public class ItemTouchHelperCallback extends ItemTouchHelper.Callback { private IMoveAndSwipeCallback | ItemTouchHelper.DOWN; //item支持左滑 final int swipeFlags = ItemTouchHelper.LEFT; itemTouchHelper = new ItemTouchHelper(itemTouchHelperCallback); itemTouchHelper.attachToRecyclerView ItemTouchHelper.gif 项目地址:https://gitee.com/aruba/RecyclerViewApplication.git
ItemTouchHelper的基本使用上次已经介绍了,今天来分析下ItemTouchHelper的源码,我们从attachToRecyclerView方法入手 /** * Attaches the ItemTouchHelper to the provided RecyclerView. which you want to add this helper or * {@code null} if you want to remove ItemTouchHelper 继承ItemDecoration干了什么,发现ItemTouchHelper改写了onDraw和onDrawOver方法 /** * 该方法在recyclerView的draw方法中调用 = ItemTouchHelper.ACTION_STATE_DRAG) { draw(c, recyclerView, view, dX, dY);
简介 ( 拖动/滑动事件 | ItemTouchHelper.Callback 回调 ) 【Android 事件分发】ItemTouchHelper 实现侧滑删除 ( 设置滑动方向 | 启用滑动操作 , 响应这些事件 ; 初始化 RecyclerView 并设置 ItemTouchHelper 示例 : //1 . 自定义实现 ---- 其中的 ItemTouchHelper.Callback 一般都需要开发者自定义子类实现 ; 1、设置移动标志 ( 拖动/滑动 ) 重写 ItemTouchHelper.Callback = ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT; // 应用 拖动 和 滑动 设置 return makeMovementFlags = ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT; // 应用 拖动 和 滑动 设置 return makeMovementFlags
上下拖动时与其他item进行位置交换 ItemTouchHelper.Callback本身不具备将两个item互换位置的功能,但RecyclerView可以,我们可以在item拖动的时候把当前item与另一个 | ItemTouchHelper.RIGHT | ItemTouchHelper.UP | ItemTouchHelper.DOWN; | ItemTouchHelper.DOWN; dragFlag = ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT; | ItemTouchHelper.DOWN; swipeFlag = ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT; itemTouchHelper = new ItemTouchHelper(callback); try{ //关联recyclerView,一个helper对象只能对应一个recyclerView
简介 ( 拖动/滑动事件 | ItemTouchHelper.Callback 回调 ) 【Android 事件分发】ItemTouchHelper 实现侧滑删除 ( 设置滑动方向 | 启用滑动操作 回调类 3、执行效果 三、博客资源 一、ItemTouchHelper.Callback 配置侧滑删除 ---- 1、设置移动标志 ( 拖动/滑动 ) 重写 ItemTouchHelper.Callback 的 getMovementFlags 方法 , 在该方法中设置滑动/拖动标志位 ; 滑动 / 拖动 标志 , 可使用 ItemTouchHelper.UP , ItemTouchHelper.DOWN , ItemTouchHelper.LEFT , ItemTouchHelper.RIGHT , 进行或操作得到 ; // 设置拖动方向, 此处设置上下拖动事件 int = ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT; 再将 拖动标志 和 滑动标志 传入 makeMovementFlags 方法 , 得到一个移动标志位 ,
简介 ( 拖动/滑动事件 | ItemTouchHelper.Callback 回调 ) 【Android 事件分发】ItemTouchHelper 实现侧滑删除 ( 设置滑动方向 | 启用滑动操作 回调类 3、执行效果 三、博客资源 一、ItemTouchHelper.Callback 配置侧滑删除 ---- 1、设置移动标志 ( 拖动/滑动 ) 重写 ItemTouchHelper.Callback 的 getMovementFlags 方法 , 在该方法中设置滑动/拖动标志位 ; 滑动 / 拖动 标志 , 可使用 ItemTouchHelper.UP , ItemTouchHelper.DOWN , ItemTouchHelper.LEFT , ItemTouchHelper.RIGHT , 进行或操作得到 ; // 设置拖动方向, 此处设置上下拖动事件 int = ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT; 再将 拖动标志 和 滑动标志 传入 makeMovementFlags 方法 , 得到一个移动标志位 ,
上次分析源码,我们知道,ItemTouchHelper对被选中的ViewHodler进行动画操作都是通过ItemTouchUIUtilImpl这个类,我们想要实现侧滑删除,必定需要对ViewHodler 进行平移操作,ItemTouchHelper.Callback通过onChildDraw方法调用了ItemTouchUIUtilImpl中的方法,所以我们改写onChildDraw方法 @Override recyclerview.gif 但是,我们的item并不能获取点击事件,因为ItemTouchHelper并没有把事件传递给子控件,解决方法:把ItemTouchHelper复制到自己的项目中!
简介 ( 拖动/滑动事件 | ItemTouchHelper.Callback 回调 ) 【Android 事件分发】ItemTouchHelper 实现侧滑删除 ( 设置滑动方向 | 启用滑动操作 系列文章目录 一、ItemTouchHelper 事件分发源码分析入口 二、ItemTouchHelper 绑定 RecyclerView 源码分析 1、ItemTouchHelper.attachToRecyclerView 事件分发源码分析入口 ---- ItemTouchHelper 使用时 , 是为 ItemTouchHelper 设置一个 RecyclerView 列表 , 不是给 RecyclerView 设置一个 ItemTouchHelper ; //4. 中实现 , 要研究其中的事件分发原理 , 主要分析 ItemTouchHelper 中的源码即可 ; 二、ItemTouchHelper 绑定 RecyclerView 源码分析 ---- 1、ItemTouchHelper.attachToRecyclerView
创建 ItemTouchHelper 创建一个 ItemTouchHelper 对象,然后其调用 attachToRecyclerView 方法: RecyclerView recyclerView = ); 在创建 ItemTouchHelper 对象时候,需要我们传入一个实现了 ItemTouchHelper.Callback 接口的对象。 实现 ItemTouchHelper.Callback 接口 创建 MyItemTouchCallback 类,实现 ItemTouchHelper.Callback 接口: public class | ItemTouchHelper.UP | ItemTouchHelper.RIGHT | ItemTouchHelper.LEFT; swipeFlag = 0; } else { dragFlag = ItemTouchHelper.DOWN | ItemTouchHelper.UP; swipeFlag =
以下是RecyclerView结合ItemTouchHelper实现的列表和网格布局的拖拽效果。 主要就要使用到ItemTouchHelper ,ItemTouchHelper 是support-v7包中加入的一个帮助开发人员处理拖拽和滑动的实现类,它能够让你非常容易实现侧滑删除、拖拽的功能。 我们只需要实例化一个ItemTouchHelper,然后关联到RecyclerView就OK了: itemTouchHelper = new ItemTouchHelper(new ItemTouchHelper.Callback ()); itemTouchHelper.attachToRecyclerView(recyclerView); 构造方法中需要一个ItemTouchHelper.Callback,ItemTouchHelper | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT; final int swipeFlags
1、效果2、简介本文主角是ItemTouchHelper。它是RecyclerView对于item交互处理的一个「辅助类」,主要用于拖拽以及滑动处理。 or ItemTouchHelper.UP or ItemTouchHelper.RIGHT or ItemTouchHelper.DOWN return makeMovementFlags or ItemTouchHelper.DOWN swipeFlags = ItemTouchHelper.START or ItemTouchHelper.END val dragCallBack = DragCallBack(mAdapter, list) val itemTouchHelper = ItemTouchHelper(dragCallBack ItemTouchHelper(dragCallBack) itemTouchHelper.attachToRecyclerView(mBinding.recycleView)复制代码实例化
要实现这个拖动重排序功能,主要是用到了RecycleView的ItemTouchHelper类 首先是定义一个接口 interface ItemTouchHelperAdapter { fun items, i, i - 1) } } notifyItemMoved(fromPosition, toPosition) } } 实现ItemTouchHelper 的Callback接口方法 class SimpleItemTouchHelperCallback(private val adapter: ItemTouchHelperAdapter) : ItemTouchHelper.Callback or ItemTouchHelper.RIGHT return makeMovementFlags(dragFlags, 0) } override fun onMove or ItemTouchHelper.RIGHT 如果是竖直方向上拖动,则是用 ItemTouchHelper.UP or ItemTouchHelper.DOWN 最后绑定到我们的RecycleView
ItemTouchHelper用法: // COMPLETED (3) Create a new ItemTouchHelper with a SimpleCallback that handles directions // Create an item touch helper to handle swiping items off the list new ItemTouchHelper (new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) { / mAdapter.swapCursor(getAllGuests()); } //COMPLETED (11) attach the ItemTouchHelper
or ItemTouchHelper.UP or ItemTouchHelper.RIGHT or ItemTouchHelper.DOWN return makeMovementFlags or ItemTouchHelper.DOWN swipeFlags = ItemTouchHelper.START or ItemTouchHelper.END val dragCallBack = DragCallBack(mAdapter, list) val itemTouchHelper = ItemTouchHelper(dragCallBack = ItemTouchHelper(dragCallBack) itemTouchHelper.attachToRecyclerView(mBinding.recycleView) 实例化 ItemTouchHelper,然后调用其attachToRecyclerView方法绑定到RecyclerView。
当然,今天我们不涉及其他地方的使用) 实现的代码并关联到 RecyclerView 非常简单,代码如下: ItemTouchHelper itemTouchHelper = new ItemTouchHelper 需要我们关注的是创建 ItemTouchHelper 时传入的参数 ItemTouchHelper.Callback() 。 | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT; int swipeFlags | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT; int swipeFlags | ItemTouchHelper.DOWN; //注意:和拖曳的区别就是在这里 int swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END
简介 ( 拖动/滑动事件 | ItemTouchHelper.Callback 回调 ) 【Android 事件分发】ItemTouchHelper 实现侧滑删除 ( 设置滑动方向 | 启用滑动操作 | 滑动距离判定 | 滑动速度判定 | 设置动画时间 | 设置侧滑触发操作 ) 【Android 事件分发】ItemTouchHelper 实现拖动排序 ( 设置滑动方向 | 启启用长按拖动功能 | 拖动距离判定 | 设置拖动触发操作 ) 【Android 事件分发】ItemTouchHelper 事件分发源码分析 ( 绑定 RecyclerView ) 【Android 事件分发】ItemTouchHelper 涉及到的本博客相关源码 四、博客资源 一、OnItemTouchListener 事件监听器引入 ---- 在上一篇博客 【Android 事件分发】ItemTouchHelper 事件分发源码分析 ( 绑定 RecyclerView ) 分析了 ItemTouchHelper 添加时 , 调用了 mItemTouchHelper.attachToRecyclerView(recycler_view
因为RecycleView提供了拖动的回调ItemTouchHelper.Callback,通过实现该类,会让我们少写很多代码。 先看一下,简化后的Demo效果图。 ? 这里的实现的效果是: ① 第一个标签不可编辑 ② 除了第一个标签外,其它标签可拖拽排序和删除 ItemTouchHelper.Callback的实现类 public class ItemDragCallback extends ItemTouchHelper.Callback { private ChannelAdapter mAdapter; private boolean mEdit; | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT; int swipeFlags = 0; helper = new ItemTouchHelper(callback); helper.attachToRecyclerView(mRecyclerView); 到这里就结束了。
br/>
* 邮箱:1981462002@qq.com
* 说明:RecyclerView条目回调
*/
public class ItemTouchCallback extends ItemTouchHelper.Callback RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
//可向上下拖动
int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
//可向左滑动
int swipeFlags = ItemTouchHelper.LEFT;
return layoutManager = new LinearLayoutManager(this);
MyAdapter adapter = new MyAdapter(mData, this);
//实例化ItemTouchHelper ItemTouchHelper touchHelper = new ItemTouchHelper(new ItemTouchCallback(adapter));
//调用ItemTouchHelper
其实就是利用RecycleView和ItemTouchHelper这两个类来实现上面的效果 好了,内容正式开始…… 1、添加依赖包 (app)build.gradle implementation 'com.android.support 5、ItemTouchHelper 还记得上面我所说的一个类吗? ItemTouchHelper对,没错就是这个,根据官方说明如下: /** * This is a utility class to add swipe to dismiss and drag & drop } class or implementing {@link ItemTouchHelper.ViewDropHandler} * interface in your LayoutManager *
* By default, ItemTouchHelper moves the items' translateX/Y properties to reposition them.