文章目录
Android 事件分发 系列文章目录
一、ItemTouchHelper.Callback 配置侧滑删除
1、设置移动标志 ( 拖动/滑动 )
2、启用长按拖动功能
3、拖动距离判定设置
4、设置拖动排序触发操作
5、RecyclerView.Adapter 适配器中的交换排序操作
三、完整代码实现
1、主界面
2、ItemTouchHelper.Callback 回调类
3、执行效果
三、博客资源
一、ItemTouchHelper.Callback 配置侧滑删除
1、设置移动标志 ( 拖动/滑动 )
重写 ItemTouchHelper.Callback 的 getMovementFlags 方法 , 在该方法中设置滑动/拖动标志位 ;
滑动 / 拖动 标志 , 可使用 ItemTouchHelper.UP , ItemTouchHelper.DOWN , ItemTouchHelper.LEFT , ItemTouchHelper.RIGHT , 进行或操作得到 ;
// 设置拖动方向, 此处设置上下拖动事件 int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN; // 设置滑动方向, 此处设置左右侧滑事件 int swipeFlags = ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
再将 拖动标志 和 滑动标志 传入 makeMovementFlags 方法 , 得到一个移动标志位 , 作为 getMovementFlags 方法的返回值 ;
makeMovementFlags(dragFlags, swipeFlags);
public class Callback extends ItemTouchHelper.Callback { /** * 设置上下左右动作 * 只有在此处打开了指定方向的设置 , 才可以应用具体方向的拖动 * @param recyclerView * @param viewHolder * @return */ @Override public int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) { // 设置拖动方向, 此处设置上下拖动事件 int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN; // 设置滑动方向, 此处设置左右侧滑事件 int swipeFlags = ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT; // 应用 拖动 和 滑动 设置 return makeMovementFlags(dragFlags, swipeFlags); } }
2、启用长按拖动功能
重写 ItemTouchHelper.Callback 的 isLongPressDragEnabled 方法 , 将该方法返回值设置为 true , 启用长按拖动功能 ;
public class Callback extends ItemTouchHelper.Callback { /** * 是否启用长按拖动功能 * @return */ @Override public boolean isLongPressDragEnabled() { return true; } }
3、拖动距离判定设置
重写 ItemTouchHelper.Callback 的 getMoveThreshold 方法 , 设置用户的拖动距离 , 组件在宽度 / 高度 上移动超过该比例 , 就认为拖动触发, 执行拖动相关操作 ;
设置的是比例值, 返回值为 0.9 , 就意味着滑动宽度/高度的 0.9 倍, 才触发拖动排序 onMove 方法 ;
public class Callback extends ItemTouchHelper.Callback { /** * 拖动幅度设置 * 组件在宽度 / 高度 上移动超过该比例 , 就认为拖动触发, 执行拖动相关操作 * @param viewHolder * @return */ @Override public float getMoveThreshold(@NonNull RecyclerView.ViewHolder viewHolder) { // 该案例中, 拖动操作只能上下进行 // 拖动超过条目组件高度超过 0.9 倍, 即可触发拖动操作 return 0.9f; } }
上面案例中设置的拖动幅度是 0.9f , 在 getMovementFlags 方法中设置的拖动方向是上下拖动 , 因此在该案例中 , 上下拖动的幅度必须要在 0.9 倍高度 , 拖动排序功能才能生效 ;
下面的操作中 , 拖动的幅度没有达到 条目组件 高度的 0.9 倍 , 拖动排序功能没有触发 ;
下面的操作中 , 拖动的幅度超过了 条目组件 高度的 0.9 倍 , 拖动排序功能 触发 ;