RecyclerView 是 Android 开发中常用的列表控件,但有时需要对列表项进行拖动排序的功能。这篇文章将介绍如何通过 ItemTouchHelper 类实现 RecyclerView 的拖动排序功能。
1. 关联 ItemTouchHelper 和 RecyclerView
首先,需要创建一个 ItemTouchHelper 对象,并将其关联到 RecyclerView 上。这样,ItemTouchHelper 就能够监测到用户的触摸操作,并相应地处理。
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(new MyItemTouchHelperCallBack());
itemTouchHelper.attachToRecyclerView(mMainRecyclerView);
2. 编写 ItemTouchHelper 的回调类
接下来,需要编写一个自定义的 ItemTouchHelper.Callback 类,用于处理拖动和滑动操作。
注意,这里的adapter是要与需要拖动的recyclerview关联的适配器
public class MyItemTouchHelperCallBack extends ItemTouchHelper.Callback {
@Override
public int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
// 定义拖动和滑动的方向
int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
int swipeFlags = 0; // 这里设为0,表示不可滑动删除
return makeMovementFlags(dragFlags, swipeFlags);
}
// 拖动时回调此方法
@Override
public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
// 获取拖动前后的位置
int from = viewHolder.getAdapterPosition();
int to = target.getAdapterPosition();
// 执行数据交换操作
MainAdapter adapter = (MainAdapter) recyclerView.getAdapter();
if (adapter != null && adapter.getData() != null) {
Collections.swap(adapter.getData(), from, to);
adapter.notifyItemMoved(from, to);
return true;
}
return false;
}
// 滑动时回调此方法
@Override
public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
// 不处理滑动操作
}
}
在上面的代码中,定义了拖动和滑动的方向,并实现了 onMove() 方法来处理拖动操作,以及 onSwiped() 方法来处理滑动操作。
通过以上步骤,你已经实现了 RecyclerView 的拖动排序功能。用户可以长按列表项并拖动进行排序,而不会触发滑动删除操作。