Android 使用ItemTouchHelper RecyclerView 的拖动和滑动删除(一)

一、ItemTouchHelper
    项目地址

gitHub 地址:https://github.com/huihui4045/AndroidWorkSpace/tree/master/Android_RecyclerviewTouch 

ItemTouchHelper是一个强大的工具,它处理好了关于在RecyclerView上添加拖动排序与滑动删除的所有事情。它是RecyclerView.ItemDecoration的子类,也就是说它可以轻易的添加到几乎所有的LayoutManager和Adapter中。它还可以和现有的item动画一起工作,提供受类型限制的拖放动画等等,这篇文章中,我会演示一个ItemTouchHelper的简单实现,然后在这个系列文章的后面部分,我们将拓展范围,探索一些新的特性。

使用 ItemTouchHelper 和 ItemTouchHelper.Callback

要使用ItemTouchHelper,你需要创建一个ItemTouchHelper.Callback。这个接口可以让你监听“move”与 “swipe”事件。这里还是控制view被选中的状态以及重写默认动画的地方。如果你只是想要一个基本的实现,有一个帮助类可以使用:SimpleCallback,但是为了了解其工作机制,我们还是自己实现。

启用基本的拖动排序与滑动删除需要重写的主要回调方法是:

int getMovementFlags(RecyclerView recyclerView,RecyclerView.ViewHolder viewHolder)  

boolean onMove(RecyclerView recyclerView,RecyclerView.ViewHolder viewHolder,RecyclerView.ViewHolder target)

void onSwiped(RecyclerView.ViewHolder viewHolder, intdirection)



下面将介绍以上三个方法的具体用法:

public intgetMovementFlags(RecyclerView recyclerView,RecyclerView.ViewHolder viewHolder) {

// Set movement flags based on the layout manager

if(recyclerView.getLayoutManager()instanceofGridLayoutManager) {

final intdragFlags = ItemTouchHelper.UP| ItemTouchHelper.DOWN| ItemTouchHelper.LEFT| ItemTouchHelper.RIGHT;

final intswipeFlags =0;

returnmakeMovementFlags(dragFlags,swipeFlags);

}else{

final intdragFlags = ItemTouchHelper.UP| ItemTouchHelper.DOWN;

final intswipeFlags = ItemTouchHelper.START| ItemTouchHelper.END;

returnmakeMovementFlags(dragFlags,swipeFlags);

}


ItemTouchHelper可以让你轻易得到一个事件的方向。你需要重写getMovementFlags()方法来指定可以支持的拖放和滑动的方向。使用helperItemTouchHelper.makeMovementFlags(int,int)来构造返回的flag。这里我们启用了上下左右两种方向。注:上下为拖动(drag),左右为滑动(swipe)。

public boolean onMove(RecyclerView recyclerView,RecyclerView.ViewHolder viewHolder,RecyclerView.ViewHolder target) {

returnlistener.onItemMove(viewHolder.getAdapterPosition(),target.getAdapterPosition());

}

@Override

public booleanonItemMove(intfromPosition, inttoPosition) {

if(fromPosition< toPosition) {

for(inti =fromPosition;i < toPosition;i++) {

Collections.swap(mTitles,i,i +1);

}

}else{

for(inti =fromPosition;i > toPosition;i--) {

Collections.swap(mTitles,i,i -1);

}

}

notifyItemMoved(fromPosition,toPosition);

return true;

}


onMove回调的是所要交换的两个itemView 的 通过notifyItemMoved(fromPosition,toPosition); 完成位置的交换。

@Override

public void onSwiped(RecyclerView.ViewHolder viewHolder, intdirection) {

listener.onItemDismiss(viewHolder.getAdapterPosition());

}

@Override

public voidonItemDismiss(intposition) {

mTitles.remove(position);

notifyItemRemoved(position);

}

onSwiped 方法返回的是要删除的item 的位置  通过viewHolder.getAdapterPosition 获取位置。

你可能感兴趣的:(Android 使用ItemTouchHelper RecyclerView 的拖动和滑动删除(一))