「这是我参与2022首次更文挑战的第3天,活动详情查看:2022首次更文挑战」
一、 介绍
应该有一些人对ItemTounchHelper不太熟悉,它也是RecyclerView的一个辅助类,它可以实现RecyclerView的拖拽和滑动处理,让这些看起来很复杂的效果变的简单起来
ItemTounchHelper继承了ItemDecoration,所以它本质上就是一个ItemDecoration
本篇主要介绍RecyclerView的拖拽功能
二、 配置
我们新建一个ItemTounchHelperDemo继承ItemTouchHelper.Callback,
我们来看看ItemTouchHelper.Callback都有什么方法
- getMovementFlags()定义Item的拖拽、滑动方向 设置拖拽方向,例如设置为上下拖动
设置滑动方向,例如设置为左右滑动
再将拖拽和滑动标志传入到makeMovementFlags()方法中,得到一个int类型的标志位,作为返回值
当设置了dragFlags,那么当我们长按Item的时候,就会进入拖拽状态,并且不断调用onMove()方法
public int getMovementFlags(@NonNull @NotNull RecyclerView recyclerView, @NonNull @NotNull RecyclerView.ViewHolder viewHolder) {
int dragFlags=ItemTouchHelper.UP | ItemTouchHelper.DOWN;
int swipeFlags=ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
return makeMovementFlags(dragFlags,swipeFlags);
}
复制代码
- isLongPressDragEnabled() 启用长按拖拽功能,即长按后才能拖动Item,默认返回true
true:启用
false:不启用
重写isLongPressDragEnabled()方法,将返回值设置为true,就可以启动长按拖拽功能了
public boolean isLongPressDragEnabled() {
return true;
}
复制代码
-
startDrag() 如果想自定义触摸view,那么就使用startDrag()方法而不是isLongPressDragEnabled()了,比如实现一部分支持拖拽,一部分不支持拖拽 首先,我们需要先将isLongPressDragEnabled()设置为false,然后给RecyclerView的item添加长按事件,在在长按方法中判断item是否支持长按拖拽
-
getMoveThreshold() 用来设置拖动距离判定,当组件移动超过设置的比例后,就认为触发拖动,执行相关操作,案例设置的是拖动超过条目高度的0.6倍,触发拖动操作
public float getMoveThreshold(@NonNull @NotNull RecyclerView.ViewHolder viewHolder) {
return 0.6f;
}
复制代码
- onMove() 用户拖动后成功后,就会调用此方法,来处理具体逻辑,例如本案例中是交换item数据,并刷新界面,最后返回true,表示被拖动的ViewHolder已经移动到了目的位置
public boolean onMove(@NonNull @NotNull RecyclerView recyclerView, @NonNull @NotNull RecyclerView.ViewHolder viewHolder, @NonNull @NotNull RecyclerView.ViewHolder target) {
mAdapter.MoveToChangeItem(viewHolder.getAdapterPosition(),target.getAbsoluteAdapterPosition());
return true;
}
复制代码
三、 实现
对ItemTounchHelperDemo初始化,并调用ItemTouchHelper的attachToRecyclerView()方法,将recyclerView传进去,并且在适配器adapter中实现刚才MoveToChangeItem()方法
ItemTounchHelperDemo callback=new ItemTounchHelperDemo(this,adapter);
ItemTouchHelper helper=new ItemTouchHelper(callback);
helper.attachToRecyclerView(recyclerView);
复制代码
下一篇介绍ItemTounchHelper滑动方法