RecyclerView item拖拽交换

作者: 奔跑吧李博 | 来源:发表于2022-05-29 08:52 被阅读0次

之前在项目中自己做过recyclerView列表item交换功能,顾记录下来。

演示效果:

实现方式主要是围绕ItemTouchHelper类的使用,它是RecyclerView.ItemDecoration的子类。

用法:

private val itemTouchHelperCallBack by lazy {
    MyItemTouchHelperCallBack(adapter)
}
        
ItemTouchHelper(itemTouchHelperCallBack).attachToRecyclerView(recyclerView)

这里需要自己实现ItemTouchHelper.Callback,当ItemTouchHelper监听到recyclerView列表发生位置变化时,通过ItemTouchHelper.Callback的三个方法回调来处理事件。

需实现的三个方法:

    override fun getMovementFlags(
        recyclerView: RecyclerView,
        viewHolder: RecyclerView.ViewHolder
    ): Int {

    }

    override fun onMove(
        recyclerView: RecyclerView,
        viewHolder: RecyclerView.ViewHolder,
        target: RecyclerView.ViewHolder
    ): Boolean {

    }

    override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {

    }
  • getMovementFlags
    需返回makeMovementFlags()方法,第一个参数可设定支持拖拽的方向,比如如下;第二个参数swipeFlags表示支持滑动方向。
ItemTouchHelper.UP or ItemTouchHelper.DOWN or
                ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT
  • onMove
    第二个参数表当前拖拽的viewHolder,第三个参数表示当前要挪动到的viewHolder,可获取其adapterPosition得到其位置,然后使用adapter的notifyItemMoved方法将两个位置的数据进行交换。

  • onSwiped
    当item侧滑的回调事件,这里例子没有侧滑操作。

  • isLongPressDragEnabled
    另外,可通过重写isLongPressDragEnabled方法设置是否支持长按拖拽功能。

最后,自定义ItemTouchHelp.CallBack类全部代码:
class MyItemTouchHelperCallBack(val adapter: AppAdapter): ItemTouchHelper.Callback() {
    private var isCanDrag = false //默认关闭拖拽功能

    override fun getMovementFlags(
        recyclerView: RecyclerView,
        viewHolder: RecyclerView.ViewHolder
    ): Int {
        return makeMovementFlags(ItemTouchHelper.UP or ItemTouchHelper.DOWN or
                ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT, 0)
    }

    override fun onMove(
        recyclerView: RecyclerView,
        viewHolder: RecyclerView.ViewHolder,
        target: RecyclerView.ViewHolder
    ): Boolean {
        var movePos = viewHolder.adapterPosition
        var targetPos = target.adapterPosition
        adapter.notifyItemMoved(movePos, targetPos)
        return true
    }

    override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {

    }

    override fun isLongPressDragEnabled(): Boolean {
        return isCanDrag
    }

    fun setCanDrag(isCandrag: Boolean) {
        this.isCanDrag = isCandrag
    }
}

相关文章

网友评论

    本文标题:RecyclerView item拖拽交换

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