RecyclerView item条目拖拽更换位置

50 阅读1分钟

定义Adapter接口

interface ItemTouchHelperAdapter {
    // 当项目被拖动时调用
    fun onItemMove(fromPosition: Int, toPosition: Int): Boolean

    // 当项目被滑动删除时调用
    fun onItemDismiss(position: Int)
}

处理移动删除动作实现回调

定义Viewhodlder接口

interface ItemTouchHelperViewHolder {
    // 当项目被选中(长按)时调用
    fun onItemSelected()

    // 当项目被释放时调用
    fun onItemClear()
}

实现ItemTouchHelper动作回调

class SimpleItemTouchHelperCallback(private val adapter: ItemTouchHelperAdapter) :
    ItemTouchHelper.Callback() {

    override fun isLongPressDragEnabled() = true

    override fun isItemViewSwipeEnabled() = false

    override fun getMovementFlags(
        recyclerView: RecyclerView,
        viewHolder: RecyclerView.ViewHolder,
    ): Int {
        // 设置拖动和滑动的方向
        val dragFlags = ItemTouchHelper.UP or ItemTouchHelper.DOWN or
                ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT
        val swipeFlags = ItemTouchHelper.START or ItemTouchHelper.END
        return makeMovementFlags(dragFlags, swipeFlags)
    }

    override fun onMove(
        recyclerView: RecyclerView,
        source: RecyclerView.ViewHolder,
        target: RecyclerView.ViewHolder,
    ): Boolean {
        if (source.itemViewType != target.itemViewType) {
            return false
        }

        // 通知适配器项目位置已更改
        adapter.onItemMove(source.bindingAdapterPosition, target.bindingAdapterPosition)
        return true
    }

    override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
        // 通知适配器项目已被滑动删除
        adapter.onItemDismiss(viewHolder.bindingAdapterPosition)
    }

    override fun onSelectedChanged(viewHolder: RecyclerView.ViewHolder?, actionState: Int) {
        if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
            (viewHolder as? ItemTouchHelperViewHolder)?.onItemSelected()
        }

        super.onSelectedChanged(viewHolder, actionState)
    }

    override fun clearView(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder) {
        super.clearView(recyclerView, viewHolder)

        (viewHolder as? ItemTouchHelperViewHolder)?.onItemClear()
    }
}

实现对应接口

条目Adapter实现ItemTouchHelperAdapter

override fun onItemMove(fromPosition: Int, toPosition: Int): Boolean {
    if (fromPosition == 0 || toPosition == 0) {
        return false
    }
    // 交换数据集中的项目位置
    Collections.swap(items, fromPosition, toPosition)
    // 通知适配器项目位置已更改
    notifyItemMoved(fromPosition, toPosition)
    return true
}

override fun onItemDismiss(position: Int) {

}

创建SimpleItemTouchHelperCallback对象绑定Adapter,关联RecyclerView

// 设置ItemTouchHelper
val callback = SimpleItemTouchHelperCallback(adapter)
val touchHelper = ItemTouchHelper(callback)
touchHelper.attachToRecyclerView(recyclerView)