萌萌の初音
萌萌の初音
发布于 2023-06-29 / 1427 阅读
0

RecyclerView的ItemTouchHelper使用

需求

在很多时候,用户都需要在列表中拖动其中一项进行位置修改,根据这个来实现拖动排序效果。

技术实现

1.选用RecyclerView的ItemTouchHelper来实现,方便快捷。

ItemTouchHelper如何使用?

1.初始化方式:
ItemTouchHelper(object : ItemTouchHelper.Callback() {}).attachToRecyclerView(RecyclerView)

通过以上方式ItemTouchHelper就和RecyclerView绑定在一起了。

2.重写ItemTouchHelper.Callback内部方法,实现效果

主要重写一下两个方法:
1.getMovementFlags(recyclerView: RecyclerView, viewHolder: ViewHolder): Int =》主要是声明这个RecyclerView的item拖动重排的方向,有ItemTouchHelper.UP 、 ItemTouchHelper.DOWN 、 ItemTouchHelper.LEFT 、 ItemTouchHelper.RIGHT,分别对应上下左右四个方向,以及ACTION_STATE_IDLE、ACTION_STATE_SWIPE、ACTION_STATE_DRAG三个触发状态,分别对应空闲中、滑动中、拖动中。
2.onMove(recyclerView: RecyclerView, viewHolder: ViewHolder, target: ViewHolder): Boolean =》 这个重写方法用于拖动位置修改成功后数据层在这里进行处理。
具体如下:

object : ItemTouchHelper.Callback() {
    /**
     * 声明这个RecyclerView的item拖动重排的方向、以及触发状态
     */
    override fun getMovementFlags(recyclerView: RecyclerView, viewHolder: ViewHolder): Int {
    	return makeMovementFlags(ItemTouchHelper.UP or ItemTouchHelper.DOWN or ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT, ItemTouchHelper.ACTION_STATE_IDLE)
    }
    
    /**
     * 用于拖动位置修改成功后数据层在这里进行处理
     */
    override fun onMove(recyclerView: RecyclerView, viewHolder: ViewHolder, target: ViewHolder): Boolean {
    	Collections.swap(changeList, viewHolder.bindingAdapterPosition, target.bindingAdapterPosition)
        adapter.notifyItemMoved(viewHolder.bindingAdapterPosition, target.bindingAdapterPosition)
        return true
    }
}

在onMove中,对list数据进行交换,Collections.swap可以方便的进行数据交换;我们还需要调用adapter.notifyItemMoved来应用位置更改;这样重排序效果就实现了~