继续上一章提到的RecyclerView。这篇来写写如何实现侧滑删除,长按拖拽的功能。
首先在adapter中还需要增加,删除和交换位置的方法,来与前端实现交互
/**
* 移动Item
*
* @param fromPosition
* @param toPosition
*/
public void moveItem(int fromPosition, int toPosition) {
//做数据的交换
if (fromPosition < toPosition) {
for (int index = fromPosition; index < toPosition; index++) {
Collections.swap(数据源, index, index + 1);
}
} else {
for (int index = fromPosition; index > toPosition; index--) {
Collections.swap(数据源, index, index - 1);
}
}
notifyItemMoved(fromPosition, toPosition);
}
/**
* 滑动Item
*
* @param position
*/
public void removeItem(int position) {
数据源.remove(position);//删除数据
notifyItemRemoved(position);
}
接着就是交互最重要的控件类ItemTouchHelper的声明了
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(new ItemTouchHelper.Callback() {
@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {//actionState : action状态类型,有三类 ACTION_STATE_DRAG (拖曳),ACTION_STATE_SWIPE(滑动),ACTION_STATE_IDLE(静止)
int dragFlags = makeFlag(ItemTouchHelper.ACTION_STATE_DRAG, ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT);//支持上下左右的拖曳
int swipeFlags = makeMovementFlags(ItemTouchHelper.ACTION_STATE_SWIPE, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT);//表示支持左右的滑动
return makeMovementFlags(dragFlags, swipeFlags);//直接返回0表示不支持拖曳和滑动
}
/**
* @param recyclerView attach的RecyclerView
* @param viewHolder 拖动的Item
* @param target 放置Item的目标位置
* @return
*/
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
int fromPosition = viewHolder.getAdapterPosition();//要拖曳的位置
int toPosition = target.getAdapterPosition();//要放置的目标位置
mRecyclerAdapter.moveItem(fromPosition, toPosition);
return true;
}
/**
* @param viewHolder 滑动移除的Item
* @param direction
*/
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
int position = viewHolder.getAdapterPosition();//获取要滑动删除的Item位置
mRecyclerAdapter.removeItem(position);
}
@Override
public boolean isLongPressDragEnabled() {
return super.isLongPressDragEnabled();//不支持长按拖曳效果直接返回false
}
@Override
public boolean isItemViewSwipeEnabled() {
return super.isItemViewSwipeEnabled();//不支持滑动效果直接返回false
}
});
将声明完毕的ItemTouchHelper附件到view上去
itemTouchHelper.attachToRecyclerView(mRecyclerView);
就基本实现了我们需要的功能