我列出了 ItemTouchHelper.SimpleCallback 和 ItemTouchHelper.Callback() 的代码。代码中列出了注释,以帮助分解发生的事情。
ItemTouchHelper.SimpleCallback
在 RecyclerView 实现下的 Activity/Fragment 中创建一个 ItemTouchHelper.SimpleCallback 对象。您需要覆盖 onMove() 和 onSwiped() 方法。
ItemTouchHelper(object : ItemTouchHelper.SimpleCallback(
ItemTouchHelper.UP or ItemTouchHelper.DOWN,
ItemTouchHelper.RIGHT or ItemTouchHelper.LEFT
) {
// You'll need to Override
override fun onMove(
recyclerView: RecyclerView,
viewHolder: ViewHolder,
target: ViewHolder
): Boolean {
// Get the position start position of the item
val startPosition = viewHolder.adapterPosition
// Get the endPosition, where you draged it to.
val endPosition = target.adapterPosition
// Submit start and end position to notifyItemMoved.
recyclerView.adapter?.notifyItemMoved(startPosition, endPosition)
// true if moved, false otherwise
return true
}
override fun onSwiped ...
如果你想创建一个 CustomItemTouchCallback
创建一个扩展 ItemTouchHelper.Callback() 的 customItemTouchHelper 类,您需要覆盖 getMovementFlags()、onMove() 和 onSwiped()
class CustomItemTouchHelper(mContext: Context, val viewModel: MyViewModel) : ItemTouchHelper.Callback() {
override fun getMovementFlags(
recyclerView: RecyclerView,
viewHolder: RecyclerView.ViewHolder
): Int {
val dragFlags = ItemTouchHelper.UP or ItemTouchHelper.DOWN
val swipeFlags = ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT
return makeMovementFlags(dragFlags, swipeFlags)
}
override fun onMove(
recyclerView: RecyclerView,
viewHolder: RecyclerView.ViewHolder,
target: RecyclerView.ViewHolder
): Boolean {
val startPosition = viewHolder.adapterPosition
val endPosition = target.adapterPosition
recyclerView.adapter?.notifyItemMoved(fromPosition, toPosition)
// true if moved, false otherwise
return true
}
override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
val editList: MutableList<User>? = viewModel.usersList?.value as MutableList<User>?
val editListCopy = editList?.toMutableList()
editListCopy?.removeAt(viewHolder.adapterPosition)
viewModel.usersList?.postValue(editListCopy)
}
override fun isItemViewSwipeEnabled(): Boolean {
// Allows items to be swiped left or right.
return true
}
override fun isLongPressDragEnabled(): Boolean {
// Allows for long click so items can be dragged, moved up or down in the list.
return true
}
}
现在在您的 Activity 或 Fragment 中,您需要创建一个 CustomItemHelper 对象,然后将 RecyclerView 附加到它。
val rv = findViewById<RecyclerView>(R.id.recycler_view)
rv.apply {
...
val customItemTouchHelper = ItemTouchHelper(CustomItemTouchHelper(context, viewModel))
customItemTouchHelper.attachToRecyclerView(rv)
}