ItemTouchHelper是一個支持RecyclerView滑動刪除僻孝、長按拖拽的一個工具類,使用它我們可以裝B無止境,提高用戶體驗虚缎。
長按拖拽的效果
長按拖拽 | 滑動刪除 |
---|---|
longdrag
|
swipedelete
|
ItemTouchHelper使用中常見的一些方法
使用ItemTouchHelper我們需要自定義一個類繼承ItemTouchHelper.Callback實現(xiàn)它的幾個重要的構造方法
- public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder),這個方法返回RecyclerView的Item可以滑動钓株、拖拽的方向实牡,dragFlags是拖拽的方向,swipeFlags是滑動轴合〈次耄可以根據不同的需求定義滑動、拖拽的方向受葛。
@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
RecyclerView.LayoutManager manager = recyclerView.getLayoutManager();
int dragFlags;
if (manager instanceof GridLayoutManager || manager instanceof StaggeredGridLayoutManager) {
//網格布局管理器允許上下左右拖動
dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
} else {
//其他布局管理器允許上下拖動
dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
}
return makeMovementFlags(dragFlags, 0);
}
- public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target),拖拽到新位置時候的回調方法,這里通過接口回調將開始position和結束position通知給到使用的地方题涨,讓其進行數(shù)據處理。
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
//不同Type之間不允許移動
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)总滩,當用戶左右滑動的時候執(zhí)行的方法,這里通過接口回調將滑動的Item的position通知到調用者纲堵。
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
if (onItemSwipeListener != null) {
onItemSwipeListener.onItemSwiped(viewHolder.getAdapterPosition());
}
}
- public boolean isLongPressDragEnabled(),是否支持長按拖拽闰渔,默認值為true席函。
@Override
public boolean isLongPressDragEnabled() {
return super.isLongPressDragEnabled();
}
- public boolean isItemViewSwipeEnabled(),是否支持滑動冈涧,默認值為true茂附。
@Override
public boolean isItemViewSwipeEnabled() {
return super.isItemViewSwipeEnabled();
}
項目完整代碼ItemTouchHelper