Android ItemTouchHelper 實(shí)踐
實(shí)現(xiàn)RecyclerView拖動(dòng)排序和滑動(dòng)刪除,我想到的是 ViewDragHelper 撑蚌,或者是第三方庫(kù)等限,當(dāng)我看了 ToDoList 的時(shí)候愕鼓,發(fā)現(xiàn)原來(lái)官方已經(jīng)支持RecyclerView拖動(dòng)排序與滑動(dòng)刪除囤采,那就是ItemTouchHelper。
簡(jiǎn)介
“ItemTouchHelper is a utility class to add swipe to dismiss and drag & drop support to RecyclerView.
It works with a RecyclerView and a Callback class, which configures what type of interactions are enabled and also receives events when user performs these actions.
Depending on which functionality you support, you should override onMove(RecyclerView, ViewHolder, ViewHolder) and / or onSwiped(ViewHolder, int).”
ItemTouchHelper 實(shí)現(xiàn)RecyclerView拖動(dòng)排序和滑動(dòng)刪除寺惫,我們需要重寫(xiě)方法:
int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder)
指定可以支持的拖放和滑動(dòng)的方向疹吃,上下為拖動(dòng)(drag),左右為滑動(dòng)(swipe)
onMove(RecyclerView, ViewHolder, ViewHolder)
滑動(dòng)操作
onSwiped(ViewHolder, int)
刪掉操作
實(shí)踐
依賴
app/build.gradle
compile 'com.android.support:recyclerview-v7:25.0.0'
效果預(yù)覽
線性
網(wǎng)格
ItemTouchHelperCallback
新建ItemTouchHelperCallback繼承ItemTouchHelper.Callback西雀,完整代碼如下:
public class ItemTouchHelperCallback extends ItemTouchHelper.Callback {
private ItemTouchHelperAdapter itemTouchHelperAdapter;
private float ALPHA_FULL = 1.0f;
ItemTouchHelperCallback(ItemTouchHelperAdapter itemTouchHelperAdapter) {
this.itemTouchHelperAdapter = itemTouchHelperAdapter;
}
/**
* RecyclerView item支持長(zhǎng)按進(jìn)入拖動(dòng)操作
*/
@Override
public boolean isLongPressDragEnabled() {
return true;
}
/**
* RecyclerView item任意位置觸發(fā)啟用滑動(dòng)操作
*/
@Override
public boolean isItemViewSwipeEnabled() {
return true;
}
/**
* 指定可以支持的拖放和滑動(dòng)的方向萨驶,上下為拖動(dòng)(drag),左右為滑動(dòng)(swipe)
*/
@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
if (recyclerView.getLayoutManager() instanceof GridLayoutManager || recyclerView.getLayoutManager() instanceof StaggeredGridLayoutManager) {
final int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
//不需要滑動(dòng)
final int swipeFlags = 0;
return makeMovementFlags(dragFlags, swipeFlags);
} else {
final int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
final int swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END;
return makeMovementFlags(dragFlags, swipeFlags);
}
}
/**
* 滑動(dòng)操作
*/
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
if (viewHolder.getItemViewType() != target.getItemViewType()) {
return false;
}
// Notify the adapter of the move
itemTouchHelperAdapter.onItemMove(viewHolder.getAdapterPosition(), target.getAdapterPosition());
return true;
}
/**
* 刪掉操作
*/
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
itemTouchHelperAdapter.onItemDismiss(viewHolder.getAdapterPosition());
}
@Override
public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) {
//自定義滑動(dòng)動(dòng)畫(huà)
final float alpha = ALPHA_FULL - Math.abs(dX) / (float) viewHolder.itemView.getWidth();
viewHolder.itemView.setAlpha(alpha);
viewHolder.itemView.setTranslationX(dX);
} else {
super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
}
}
@Override
public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
// We only want the active item to change
if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
if (viewHolder instanceof ItemTouchHelperViewHolder) {
// Let the view holder know that this item is being moved or dragged
ItemTouchHelperViewHolder itemViewHolder = (ItemTouchHelperViewHolder) viewHolder;
//選中狀態(tài)回調(diào)
itemViewHolder.onItemSelected();
}
}
super.onSelectedChanged(viewHolder, actionState);
}
@Override
public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
super.clearView(recyclerView, viewHolder);
viewHolder.itemView.setAlpha(ALPHA_FULL);
if (viewHolder instanceof ItemTouchHelperViewHolder) {
// Tell the view holder it's time to restore the idle state
ItemTouchHelperViewHolder itemViewHolder = (ItemTouchHelperViewHolder) viewHolder;
//未選中狀態(tài)回調(diào)
itemViewHolder.onItemClear();
}
}
}
attachToRecyclerView
創(chuàng)建ItemTouchHelper對(duì)象艇肴,然后調(diào)用attachToRecyclerView(RecyclerView) 方法
ItemTouchHelperCallback itemTouchHelperCallback = new ItemTouchHelperCallback(recyclerViewAdatper);
itemTouchHelper = new ItemTouchHelper(itemTouchHelperCallback);
itemTouchHelper.attachToRecyclerView(recyclerView);
源碼
更多詳見(jiàn)源碼:github.com/WuXiaolong/… 腔呜,很多參考了iPaulPro/Android-ItemTouchHelper-Demo,關(guān)鍵需要消化再悼,轉(zhuǎn)化成自己的東西核畴。