RecyclerView 实现拖拽、滑动删除

借助ItemTouchHelper即可实现如下效果图的拖拽
在这里插入图片描述

  1. 继承ItemTouchHelper.Callback
class RvTouchHelperCall(val adapter: RvAdapter) : ItemTouchHelper.Callback() {

    /**
     * 返回滑动,拖拽方向
     * @param recyclerView
     * @param viewHolder 需要移动信息的viewHelper
     * @return
     */
    @Override
    public int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
        val manager = recyclerView.layoutManager
        var dragFlags = 0
        var swipeFlags = 0
        when(manager){
        	//可上下左右拖拽
            is GridLayoutManager ->{
            	//拖拽方向
                dragFlags = ItemTouchHelper.UP or ItemTouchHelper.DOWN or ItemTouchHelper.START or ItemTouchHelper.END
            }
            //可上下左右拖拽
            is StaggeredGridLayoutManager -> {
            	//拖拽方向
                dragFlags = ItemTouchHelper.UP or ItemTouchHelper.DOWN or ItemTouchHelper.START or ItemTouchHelper.END
            }
            //可上下拖拽,左右滑动移除item
            is LinearLayoutManager -> {
            	//拖拽方向
                dragFlags = ItemTouchHelper.UP or ItemTouchHelper.DOWN
                //滑动方向,不需要滑动移除item的swipeFlags设置为0
                swipeFlags = ItemTouchHelper.START or ItemTouchHelper.END
            }
        }
        return makeMovementFlags(dragFlags,swipeFlags)
    }

    /**
     * 拖拽时回调的方法
     * @param recyclerView
     * @param viewHolder 正在拖动的viewHelper
     * @param target 拖拽方向下个item的viewHelper
     * @return
     */
    @Override
    public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
        //起始位置
        val startPosition =  viewHolder.adapterPosition
        //结束位置
        val endPosition = target.adapterPosition
        adapter.moveItem(startPosition,endPosition)
        return true
    }

    /**
     * 滑动时回调的方法
     * @param viewHolder
     * @param direction RecyclerView的状态
     * ItemTouchHelper.ACTION_STATE_IDLE 空闲状态
     */
    @Override
    public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
		adapter.deleteItem(viewHolder.adapterPosition)
    }

    /**
     * 当ItemTouchHelper 滑动、拖拽的ViewHelper发生更改时调用,在此添加动画等
     * @param viewHolder
     * @param actionState
     */
    @Override
    public void onSelectedChanged(@Nullable RecyclerView.ViewHolder viewHolder, int actionState) {
    	//按下时放大
        if (actionState != ItemTouchHelper.ACTION_STATE_IDLE){
            viewHolder?.let {
                val animate = ViewCompat.animate(it.itemView)
                animate.duration = 200
                animate.scaleX(1.2f).scaleY(1.2f).start()
            }
        }
        super.onSelectedChanged(viewHolder, actionState);
    }

    /**
     * 拖拽或滑动结束时回调,在此结束动画
     * @param recyclerView
     * @param viewHolder 用户交互的viewHelper
     */
    @Override
    public void clearView(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
    	val animate = ViewCompat.animate(viewHolder.itemView)
        animate.duration = 200
        animate.scaleX(1f).scaleY(1f).start()
        super.clearView(recyclerView, viewHolder);
    }
}

2.在Adapter中实现moveItem(),deleteItem()

class RvAdapter(private val items: ArrayList<String>) : RecyclerView.Adapter<RvHolder>() {

    ... ...

    fun itemMove(startPosition: Int, endPosition: Int) {
    	//拖拽时,调整adapter数据的顺序
        Collections.swap(items,startPosition,endPosition)
        notifyItemMoved(startPosition,endPosition)
    }

    fun itemDelete(adapterPosition: Int) {
    	//移除数据
        items.removeAt(adapterPosition)
        notifyItemRemoved(adapterPosition)
    }
}

3.ItemTouchHelper于RecyclerView 关联起来

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val items = arrayListOf<String>()
        for (index in 0..40){
            items.add("item index = $index")
        }
        val adapter = RvAdapter(items)
        val rv = findViewById<RecyclerView>(R.id.rlv)
        val itemDecoration = RvItemDecoration()
        rv.layoutManager = GridLayoutManager(this,2)
        rv.adapter = adapter
        if (rv.itemDecorationCount <= 0){
            rv.addItemDecoration(itemDecoration)
        }
        val callback = RvTouchHelperCall(adapter)
        val helper = ItemTouchHelper(callback)
        helper.attachToRecyclerView(rv)
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值