RecyclerView 的拖拽和长按变化Item的位置,设置左右滑动删除数据和滑动改变背景等

项目地址:https://github.com/ChloeDimen/RecyclerviewDemo点击打开链接

1:想要实现RecyclerView 的拖拽和长按变化Item的位置,设置左右滑动删除数据和滑动改变背景的关键字:ItemTouchHelper

关键代码:

MyItemTouchHelperCallBack callback = new MyItemTouchHelperCallBack(adapter);
 itemTouchHelper = new ItemTouchHelper(callback);
itemTouchHelper.attachToRecyclerView(rl_data);

2:主要是实现MyItemTouchHelperCallback继承ItemTouchHelper.callback

public class MyItemTouchHelperCallBack extends ItemTouchHelper.Callback {
    private ItemTouchMoveListener mItemTouchMoveListener;

    public MyItemTouchHelperCallBack(ItemTouchMoveListener itemTouchMoveListener) {
        mItemTouchMoveListener = itemTouchMoveListener;
    }

    //callback回调监听先调用的,用来判断是什么动作,比如判断方向(意思就是我要监听那个方向的拖到)
    @Override
    public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
        //方向Up,down.left,right
        //ItemTouchHelper.UP,ItemTouchHelper.DOWN,ItemTouchHelper.LEFT,ItemTouchHelper.RIGHT
        int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;//添加上下滑动
        //int swipeFlags = 0;
        int swipeFlags = ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;//添加左右滑动
        int flags = makeMovementFlags(dragFlags, swipeFlags);


        return flags;
    }

    //当移动的时候回调的方法
    @Override
    public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
        if (viewHolder.getItemViewType() != target.getItemViewType()) {//条目布局不同,就不交换位置
            return false;
        }


        //adapter.notifyItemMoved(fromPositiontoPosition);改变拖拽item位置
        mItemTouchMoveListener.onItemMove(viewHolder.getAdapterPosition(), target.getAdapterPosition());
        return false;
    }

    //侧滑
    @Override
    public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
        //监听侧滑1:删除数据;2adapter.notifyItemRemoveposition        mItemTouchMoveListener.onItemRemove(viewHolder.getAdapterPosition());

    }

    //item改变状态
    @Override
    public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {

        //判断选择状态,改变背景颜色
        if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
            viewHolder.itemView.setBackgroundColor(viewHolder.itemView.getContext().getResources().getColor(R.color.colorPrimary));

        }
        super.onSelectedChanged(viewHolder, actionState);

    }

    //状态背景颜色复原

    @Override
    public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {

        viewHolder.itemView.setBackgroundColor(Color.WHITE);

        super.clearView(recyclerView, viewHolder);
    }

    @Override
    public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
        //dx,侧滑改变特效
if (actionState==ItemTouchHelper.ACTION_STATE_SWIPE){
    //设置透明度1-0
    float result = Math.abs(dX) / viewHolder.itemView.getWidth();
    viewHolder.itemView.setAlpha(result);

    //旋转
    viewHolder.itemView.setScaleX(result);
    viewHolder.itemView.setScaleY(result);

}

        super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
    }

    @Override
    public boolean isLongPressDragEnabled() {
        //是否允许长按拖拽
        return true;
    }


}

3:实现两个接口,分别拖拽效果和删除条目和移动条目的功能

public interface OnStartDragListener {
    /**
     * 该接口用于需要主动回调拖拽效果的
     * @param viewHolder
     */
    void onStartDrag(RecyclerView.ViewHolder viewHolder);

}
public interface ItemTouchMoveListener {
    /**
     * 当拖拽的时候回调
     * 可以在此方法实现拖拽条目,并实现刷新效果
     * @param fromPosition 从什么位置拖拽
     * @param toPosition 到什么位置
     * @return  是否执行
     */
    boolean onItemMove(int fromPosition, int toPosition);

    /**
     * 当条目被移除的回调
     * @param position
     * @return
     */
    boolean onItemRemove( int position);
}

4:adapter实现两个接口

public interface ItemTouchMoveListener {
    /**
     * 当拖拽的时候回调
     * 可以在此方法实现拖拽条目,并实现刷新效果
     * @param fromPosition 从什么位置拖拽
     * @param toPosition 到什么位置
     * @return  是否执行
     */
    boolean onItemMove(int fromPosition, int toPosition);

    /**
     * 当条目被移除的回调
     * @param position
     * @return
     */
    boolean onItemRemove( int position);
}

5:长按改变背景和拖拽改变位置效果

关键代码:

方向判断:

//callback回调监听先调用的,用来判断是什么动作,比如判断方向(意思就是我要监听那个方向的拖到)
@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
    //方向Up,down.left,right
    //ItemTouchHelper.UP,ItemTouchHelper.DOWN,ItemTouchHelper.LEFT,ItemTouchHelper.RIGHT
    int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;//添加上下滑动
    //int swipeFlags = 0;
    int swipeFlags = ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;//添加左右滑动
    int flags = makeMovementFlags(dragFlags, swipeFlags);


    return flags;
}

长按:

   @Override
public boolean isLongPressDragEnabled() {
    //是否允许长按拖拽
    return true;
}


改变位置

@Override
 public boolean onItemMove(int fromPosition, int toPosition) {
     //1:数据交换;  2:刷新

     Collections.swap(number,fromPosition,toPosition);
     notifyItemMoved(fromPosition,toPosition);
     return false;
 }


6:按下图片拖拽

关键代码:监听按下的状态

holder.iv_data.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            //传递触摸情况给谁,进行按下图片拖拽
            mListener.onStartDrag(holder);
        }

        return false;
    }
});

实现拖拽功能:

@Override
public void onStartDrag(RecyclerView.ViewHolder viewHolder) {
    itemTouchHelper.startDrag(viewHolder);
}


7:左右滑动删除条目和透明度,旋转。。效果

关键代码:

//callback回调监听先调用的,用来判断是什么动作,比如判断方向(意思就是我要监听那个方向的拖到)
@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
    //方向Up,down.left,right
    //ItemTouchHelper.UP,ItemTouchHelper.DOWN,ItemTouchHelper.LEFT,ItemTouchHelper.RIGHT
    int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;//添加上下滑动
    //int swipeFlags = 0;
    int swipeFlags = ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;//添加左右滑动
    int flags = makeMovementFlags(dragFlags, swipeFlags);


    return flags;
}
//侧滑
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
    //监听侧滑1:删除数据;2adapter.notifyItemRemoveposition    mItemTouchMoveListener.onItemRemove(viewHolder.getAdapterPosition());

}

 @Override
public boolean onItemRemove(int position) {
    //1:删除数据;  2:刷新
    number.remove(position);
    notifyItemRemoved(position);
    return false;
}
 @Override
    public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
        //dx,侧滑改变特效
if (actionState==ItemTouchHelper.ACTION_STATE_SWIPE){
    //设置透明度1-0
    float result = Math.abs(dX) / viewHolder.itemView.getWidth();
    viewHolder.itemView.setAlpha(result);

    //旋转
    viewHolder.itemView.setScaleX(result);
    viewHolder.itemView.setScaleY(result);

}


8:item选中滑动效果(背景改变。。。。)

关键代码:

//item改变状态
@Override
public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {

    //判断选择状态,改变背景颜色
    if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
        viewHolder.itemView.setBackgroundColor(viewHolder.itemView.getContext().getResources().getColor(R.color.colorPrimary));

    }
    super.onSelectedChanged(viewHolder, actionState);

}

//状态背景颜色复原

@Override
public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {

    viewHolder.itemView.setBackgroundColor(Color.WHITE);

    super.clearView(recyclerView, viewHolder);
}




项目的文字说明很清晰了。

未完待续。。。。.















  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值