Skip to content

Instantly share code, notes, and snippets.

@boyan01
Last active March 11, 2018 12:05
Show Gist options
  • Save boyan01/9c907e25259356f690fed11c5ba9b134 to your computer and use it in GitHub Desktop.
Save boyan01/9c907e25259356f690fed11c5ba9b134 to your computer and use it in GitHub Desktop.
让 RecyclerView 可以左滑删除
/**
* 让 RecyclerView 可以左滑删除
* @param onItemSwiped 响应左滑删除时的调用
* @param onItemRevoked 响应撤回删除时的调用
*/
private fun <T : Any> RecyclerView.setSwipeAble(
onItemSwiped: (position: Int) -> T,
onItemRevoked: (position: Int, value: T) -> Unit,
onItemMoved: (from: Int, to: Int) -> Boolean
) = ItemTouchHelper(object : ItemTouchHelper.Callback() {
override fun getMovementFlags(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder): Int {
val dragFlag = ItemTouchHelper.UP or ItemTouchHelper.DOWN
val swipeFlag = ItemTouchHelper.START or ItemTouchHelper.END
return when (layoutManager) {
is GridLayoutManager -> makeMovementFlags(dragFlag or swipeFlag, 0)
is LinearLayoutManager -> makeMovementFlags(dragFlag, swipeFlag)
else -> makeMovementFlags(0, 0)
}
}
//用 int 和 T 键值对临时保存所擦除的那一项的 位置 和 数据
var removed: Pair<Int, T?> = -1 to null
override fun onMove(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder, target: RecyclerView.ViewHolder): Boolean {
val from = viewHolder.adapterPosition
val to = target.adapterPosition
val b = onItemMoved(from, to)
if (b) {
adapter.notifyItemMoved(from, to)
}
return b
}
override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
val adapterPosition = viewHolder.adapterPosition
removed = adapterPosition to onItemSwiped(adapterPosition)
adapter.notifyItemRemoved(adapterPosition)
Snackbar.make(this@setSwipeAble, context.getString(R.string.undo_description), Snackbar.LENGTH_LONG)
.setAction(context.getString(R.string.undo), {
val position = removed.first
val value = removed.second
if (position == -1 || value == null) {
return@setAction
}
onItemRevoked(position, value)
adapter.notifyItemInserted(position)
})
.show()
}
}).attachToRecyclerView(this@setSwipeAble)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment