Last active
March 11, 2018 12:05
-
-
Save boyan01/9c907e25259356f690fed11c5ba9b134 to your computer and use it in GitHub Desktop.
让 RecyclerView 可以左滑删除
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* 让 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