文章目录
Android 事件分发 系列文章目录
一、ItemTouchHelper.Callback 配置侧滑删除
1、设置移动标志 ( 拖动/滑动 )
2、启用滑动动作
3、滑动距离判定设置
4、滑动速度判定设置
5、设置动画时间
6、设置侧滑删除触发操作
7、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 的 isItemViewSwipeEnabled 方法 , 将该方法返回值设置为 true , 启用滑动操作 ;
public class Callback extends ItemTouchHelper.Callback { /** * 是否启用滑动操作 * @return 是否启用 true 启用, false 不启用 */ @Override public boolean isItemViewSwipeEnabled() { return true; } }
3、滑动距离判定设置
重写 ItemTouchHelper.Callback 的 getSwipeThreshold 方法 , 设置用户的滑动距离 , 设置的是比例值, 返回值为 0.5 , 就意味着滑动宽度/高度的一半, 才触发侧滑 onSwiped 方法 ;
public class Callback extends ItemTouchHelper.Callback { /** * 用户滑动距离, 设置的是比例值, 返回值为 0.5 , 就意味着滑动宽度/高度的一半, 才触发侧滑 onSwiped 方法 * @param viewHolder * @return */ @Override public float getSwipeThreshold(@NonNull RecyclerView.ViewHolder viewHolder) { return 0.5f; } }
上面案例中设置的滑动幅度是 0.5f , 在 getMovementFlags 方法中设置的滑动方向是左右滑动 , 因此在该案例中 , 滑动幅度在水平方向上超过 0.5 倍的条目组件宽度 , 侧滑删除才能生效 ;
下面的操作中 , 滑动在水平方向上没有超过组件宽度的 0.5 倍 , 滑动删除不生效 ;
下面的操作中 , 水平方向的滑动幅度超过了 0.5 倍 , 侧滑删除生效 ;
侧滑判定 : 这里有两种侧滑判定条件 , 满足任意一个即可触发侧滑删除 ;
① 条件一 : getSwipeThreshold 方法中设置的滑动距离 , 滑动超过 0.5 滑动幅度 , 触发侧滑删除 ;
② 条件二 : getSwipeEscapeVelocity 方法中设置的滑动速度 , 水平方向上每秒超过 5 像素的速度 , 触发侧滑删除 ;