需求
在很多时候,用户都需要在列表中拖动其中一项进行位置修改,根据这个来实现拖动排序效果。
技术实现
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来应用位置更改;这样重排序效果就实现了~