RecyclerView(三)--ItemTounchHelper拖拽

「这是我参与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滑动方法

分类:
Android