之前在项目中自己做过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
}
}
网友评论