这里直接上代码,相信注释已经写的很清楚了:
public class MainActivity extends AppCompatActivity {
/**
* recyclerview适配器
*/
private DragRecyclerViewAdapteer adapter;
/**
* 数据源
*/
private List<String> list;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//为了测试这里直接简单的初始化数据
list = new ArrayList<>();
for (int i = 0; i < 20; i++) {
list.add("this is " + i);
}
RecyclerView recyclerView = findViewById(R.id.recyclerview);
LinearLayoutManager layoutManager = new LinearLayoutManager(this, LinearLayoutManager
.VERTICAL, false);
adapter = new DragRecyclerViewAdapteer(list, this);
recyclerView.setLayoutManager(layoutManager);
recyclerView.setAdapter(adapter);
//这是实现拖拽的关键,自定义一个回调类继承ItemTouchHelperl.CallBack类
//实现三个抽象方法 getMovementFlags、onMove、onSwiped,具体功能在MyCallBack类中讲解
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(new MyCallBack());
itemTouchHelper.attachToRecyclerView(recyclerView);
}
public class MyCallBack extends ItemTouchHelper.Callback {
/**
* 解释下这里的滑动方向,举个例子:一个竖向的列表,我想实现item左滑删除,就需要设置这个滑动方向了
* 如果不需要设置滑动则可以设置swapeFlag=0
* 因为GridLayoutManager上下左右都可以拖拽 所以他的滑动方向swapeFlag是需要设置为0的
*
* @param recyclerView
* @param viewHolder
* @return
*/
@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
//判断recyclerview的layoutManager的类型,根据不同的类型设置不同的滑动方向和拖拽方向
if (recyclerView.getLayoutManager() instanceof LinearLayoutManager) {
//拖拽方向
int dragFlag;
//滑动方向
int swapeFlag;
//得到linearLayoutManager的列表方向
int orientation = ((LinearLayoutManager) recyclerView.getLayoutManager())
.getOrientation();
//如果列表方向是竖向的
if (orientation == LinearLayoutManager.VERTICAL) {
//拖拽方向设置为上或者下
dragFlag = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
//滑动方向设置为左或者右
swapeFlag = 0;
} else {
//拖拽方向设置为左或者右
dragFlag = ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
//滑动方向设置为上或者下
swapeFlag = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
}
//最后通过makeMovementFlags返回拖拽和滑动方向
return makeMovementFlags(dragFlag, swapeFlag);
} else {
//因为gridLayoutManager上下左右都可以拖拽,所以设置拖拽方向为四种,滑动方向为0
int dragFlag = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT |
ItemTouchHelper.RIGHT;
int swapeFlag = 0;
return makeMovementFlags(dragFlag, swapeFlag);
}
}
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder,
RecyclerView.ViewHolder target) {
//得到需要拖拽item的位置
int fromPosition = viewHolder.getAdapterPosition();
//得到item拖拽到目标的位置
int toPosition = target.getAdapterPosition();
if (fromPosition > toPosition) {
//如果是从下往上拖拽的就依次将需要拖拽的item的位置和目标的位置(拖拽item的位置-1)交换
for (int i = fromPosition; i > toPosition; i--) {
Collections.swap(list, i, i - 1);
}
} else {
//如果是从上往下拖拽的就依次将需要拖拽的item的位置和目标的位置(拖拽item的位置+1)交换
for (int i = fromPosition; i < toPosition; i++) {
Collections.swap(list, i, i + 1);
}
}
//最后通过适配器将item移动
adapter.notifyItemMoved(fromPosition, toPosition);
return true;
}
/**
* 滑动后的回调方法,
* 这里只讲解如何拖拽 ,删除可以自行判断
* @param viewHolder
* @param direction
*/
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
}
}
}