Android开发Android开发Android技术知识

RecyclerView item拖拽交换

2022-05-29  本文已影响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) {

    }
ItemTouchHelper.UP or ItemTouchHelper.DOWN or
                ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT
最后,自定义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
    }
}
上一篇 下一篇

猜你喜欢

热点阅读