一、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 获取位置。
网友评论