ItemTouchHelper是一個(gè)支持RecyclerView滑動(dòng)刪除、長(zhǎng)按拖拽的一個(gè)工具類,使用它我們可以裝B無止境,提高用戶體驗(yàn)。
長(zhǎng)按拖拽的效果
| 長(zhǎng)按拖拽 | 滑動(dòng)刪除 |
|---|---|
![]() longdrag
|
![]() swipedelete
|
ItemTouchHelper使用中常見的一些方法
使用ItemTouchHelper我們需要自定義一個(gè)類繼承ItemTouchHelper.Callback實(shí)現(xiàn)它的幾個(gè)重要的構(gòu)造方法
- public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder),這個(gè)方法返回RecyclerView的Item可以滑動(dòng)、拖拽的方向,dragFlags是拖拽的方向,swipeFlags是滑動(dòng)??梢愿鶕?jù)不同的需求定義滑動(dòng)、拖拽的方向。
@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
RecyclerView.LayoutManager manager = recyclerView.getLayoutManager();
int dragFlags;
if (manager instanceof GridLayoutManager || manager instanceof StaggeredGridLayoutManager) {
//網(wǎng)格布局管理器允許上下左右拖動(dòng)
dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
} else {
//其他布局管理器允許上下拖動(dòng)
dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
}
return makeMovementFlags(dragFlags, 0);
}
- public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target),拖拽到新位置時(shí)候的回調(diào)方法,這里通過接口回調(diào)將開始position和結(jié)束position通知給到使用的地方,讓其進(jìn)行數(shù)據(jù)處理。
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
//不同Type之間不允許移動(dòng)
if (viewHolder.getItemViewType() != target.getItemViewType()) {
return false;
}
if (onItemDragListener != null) {
onItemDragListener.onItemMove(viewHolder.getAdapterPosition(), target.getAdapterPosition());
}
return true;
}
- public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction),當(dāng)用戶左右滑動(dòng)的時(shí)候執(zhí)行的方法,這里通過接口回調(diào)將滑動(dòng)的Item的position通知到調(diào)用者。
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
if (onItemSwipeListener != null) {
onItemSwipeListener.onItemSwiped(viewHolder.getAdapterPosition());
}
}
- public boolean isLongPressDragEnabled(),是否支持長(zhǎng)按拖拽,默認(rèn)值為true。
@Override
public boolean isLongPressDragEnabled() {
return super.isLongPressDragEnabled();
}
- public boolean isItemViewSwipeEnabled(),是否支持滑動(dòng),默認(rèn)值為true。
@Override
public boolean isItemViewSwipeEnabled() {
return super.isItemViewSwipeEnabled();
}
項(xiàng)目完整代碼ItemTouchHelper

