ItemTouchHelper用于RecyclerView項的滑動、拖動控制篓吁。首先創(chuàng)建RecyclerView和Adapter阵幸,這個寫法與以前寫法相同。
滑動刪除/拖動交換位置
//第一個參數(shù)為可拖動方向鸽粉,第而個參數(shù)為可滑動方向
new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(ItemTouchHelper.UP | ItemTouchHelper.DOWN,
ItemTouchHelper.LEFT) {
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView
.ViewHolder target) {
int fromPosition = viewHolder.getAdapterPosition();//得到拖動ViewHolder的position
int toPosition = target.getAdapterPosition();//得到目標ViewHolder的position
if (fromPosition < toPosition) {
//分別把中間所有的item的位置重新交換
for (int i = fromPosition; i < toPosition; i++) {
Collections.swap(strings, i, i + 1);
}
} else {
for (int i = fromPosition; i > toPosition; i--) {
Collections.swap(strings, i, i - 1);
}
}
touchAdapter.notifyItemMoved(fromPosition, toPosition);
return true;
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
int position = viewHolder.getAdapterPosition();
strings.remove(position);
touchAdapter.notifyItemRemoved(position);
}
}).attachToRecyclerView(rv);
方向分別有6種
ItemTouchHelper.DOWN
ItemTouchHelper.LEFT
ItemTouchHelper.RIGHT
ItemTouchHelper.START
ItemTouchHelper.END
默認情況下長按可拖動改變位置,如果想直接拖動某控件改變位置的話可以
先重寫ItemTouchHelper的禁用長按拖動
public boolean isLongPressDragEnabled() {
return false;
}
然后添加以下代碼
viewHolder.dragButton.setOnTouchListener(new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
if (MotionEventCompat.getActionMasked(event) == MotionEvent.ACTION_DOWN) {
mItemTouchHelper.startDrag(viewHolder);
}
return false;
}
});
其他方法
@Override
public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
super.onSelectedChanged(viewHolder, actionState);
switch (actionState) {
case ItemTouchHelper.ACTION_STATE_IDLE:
Log.e("ACTION_STATE_IDLE", "ACTION_STATE_IDLE");
//空閑狀態(tài)
break;
case ItemTouchHelper.ACTION_STATE_SWIPE:
//滑動狀態(tài)
Log.e("ACTION_STATE_SWIPE", "ACTION_STATE_SWIPE");
break;
case ItemTouchHelper.ACTION_STATE_DRAG:
Log.e("ACTION_STATE_DRAG", "ACTION_STATE_DRAG");
//拖動狀態(tài)
break;
}
}
@Override
public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
super.clearView(recyclerView, viewHolder);
//拖動完成
}
@Override
public boolean isItemViewSwipeEnabled() {
//啟用滑動
return super.isItemViewSwipeEnabled();
}
@Override
public void onMoved(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, int fromPos,
RecyclerView.ViewHolder target, int toPos, int x, int y) {
super.onMoved(recyclerView, viewHolder, fromPos, target, toPos, x, y);
}
@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
//和SimpleCallback構造函數(shù)參數(shù)意思相同
int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
int swipeFlags = ItemTouchHelper.RIGHT;
return makeMovementFlags(dragFlags, swipeFlags);
}