ItemTouchHelper 入门一

来源:互联网 发布:淘宝店铺索引怎么写 编辑:程序博客网 时间:2024/04/29 19:32

介绍

这货是一个工具类,为RecyclerView扩展滑动消失(删除)和drag & drop效果的。它需要和RecyclerView、Callback 一起工作。Callback 类里定义了 允许哪些交互,并且会接收到对应的交互事件根据你需要哪种功能(滑动消失(删除)和drag & drop),你需要重写Callback#onMove(RecyclerView, ViewHolder, ViewHolder)-----drag & dropCallback#onSwiped(ViewHolder, int) 方法。 -----滑动消失(删除)

用法

  1. 定义一个 Callback:ItemTouchHelper.Callback callback = new ItemTouchHelper.SimpleCallback(int,int)
    这两个int分别代表要 监听哪几个方向上的拖拽、滑动事件。
    常用:ItemTouchHelper.DOWN | ItemTouchHelper.UP | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT
  2. 将Callback传给ItemTouchHelper:ItemTouchHelper itemTouchHelper = new ItemTouchHelper(callback);
  3. 关联ItemTouchHelper和RecyclerView:itemTouchHelper.attachToRecyclerView(mRv)

基本用法

// 拖拽方向int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;// 滑动支持的方向int swipeFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;//SimpleCallbackItemTouchHelper.SimpleCallback simpleCallback = new ItemTouchHelper.SimpleCallback(dragFlags, swipeFlags) {    /**     * 在RecylerView  OnDraw 回调     * 如果我们需要自定义 View的表现,重写它 是最佳的地方     * 默认改变 dx dy     * @param c                 在绘制每个 children  的 canvas     * @param recyclerView      attached to 的 RecyclerView     * @param viewHolder        当前正在拖动的 ViewHolder     * @param dX                正在拖动的 dx     * @param dY                正在拖动的 dy     * @param actionState       是哪种方式回调的 {@link #ACTION_STATE_DRAG} or {@link #ACTION_STATE_SWIPE}.     * @param isCurrentlyActive 用户滑动为 true , 自动滑动 为 false(一般都是自动复位)     */    public void onChildDraw(Canvas c, RecyclerView recyclerView,            ViewHolder viewHolder,            float dX, float dY, int actionState, boolean isCurrentlyActive) {        sUICallback.onDraw(c, recyclerView, viewHolder.itemView, dX, dY, actionState,                isCurrentlyActive);    }    /**     *  当前阈值  默认0.5f     */    @Override    public float getSwipeThreshold(RecyclerView.ViewHolder viewHolder) {        return super.getSwipeThreshold(viewHolder);    }    /**     * ItemTouchHelper可以让你轻易得到一个事件的方向。     * 你需要重写getMovementFlags()方法来指定可以支持的拖放和滑动的方向。     * 使用helperItemTouchHelper.makeMovementFlags(int, int)来构造返回的flag。     * 这里我们启用了上下左右两种方向。注:上下为拖动(drag),左右为滑动(swipe)。     */    @Override    public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {        int dragFlags = setDragFlags(recyclerView);        int swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END; //开启滑动删除//        int swipeFlags = 0;  //禁止滑动的一些操作        return makeMovementFlags(dragFlags, swipeFlags);    }   // 在Drag & Drop 会回调   @Override   public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {       //交换数据       int from = viewHolder.getAdapterPosition();       int to = target.getAdapterPosition();       Collections.swap(mStringList,from,to);       //动画       mSwipeAdapter.notifyItemMoved(from,to);       return true;   }   /**    * 滑动消失 Swipe Dismiss回调    * @param viewHolder      item 绑定的ViewHolder    * @param direction       方向    */   @Override   public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {       //滑动删除       int adapterPosition = viewHolder.getAdapterPosition();       mStringList.remove(adapterPosition);       mSwipeAdapter.notifyItemRemoved(adapterPosition);   }   /**    * 默认情况下长按可拖动改变位置,如果想直接拖动某控件改变位置的话可以    * 先重写ItemTouchHelper的禁用长按拖动    * @return true 长按  false 随意拖动    */   public boolean isLongPressDragEnabled() {       return false;   }};//ItemTouchHelperItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleCallback);//绑定RecylerViewitemTouchHelper.attachToRecyclerView(mRecyclerView);

方法的介绍

onSwiped() 方法。是滑动删除动作已经发生后回调的。

即。我们先滑动布局 , 然后松手, 此时ItemTouchHelper 判断我们的手势是删除手势
会自动对这个布局执行丢出屏幕外动画,同时回调 onSwiped() 方法。

onMove()方法。一个Item移动到另外一个Item位置。需要改变时调用
原创粉丝点击