美文网首页Android
Android 使用ItemTouchHelper Recycl

Android 使用ItemTouchHelper Recycl

作者: 千涯秋瑟 | 来源:发表于2017-02-10 16:42 被阅读250次

    一、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 Recycl

        本文链接:https://www.haomeiwen.com/subject/yrggittx.html