#android #kotlin #android-recyclerview
#Android #kotlin #android-recyclerview
Вопрос:
У меня есть 2-полосные варианты салфетки, проведите пальцем влево для удаления и проведите пальцем вправо для других действий.
Я хочу, чтобы правый свайп не удалял элемент, после прокрутки элемент должен вернуться туда, где он был.
Как я могу это реализовать?
Вот мой класс ItemTouchHelper (я не уверен, понадобится ли вам больше кода, если вы, пожалуйста, оставьте комментарий, и я добавлю соответствующий код)
ItemTouchHelper:
class ArticleItemTouchHelper(
context: Context,
private val adapter: ArticleListAdapter
) : ItemTouchHelper.Callback() {
override fun getMovementFlags(
recyclerView: RecyclerView,
viewHolder: RecyclerView.ViewHolder
): Int {
val flags = ItemTouchHelper.START or ItemTouchHelper.END
return makeMovementFlags(0, flags)
}
override fun onMove(
recyclerView: RecyclerView,
viewHolder: RecyclerView.ViewHolder,
target: RecyclerView.ViewHolder
): Boolean {
return false // We don't want support moving items up/down
}
override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
if (direction == ItemTouchHelper.START) {
adapter.onSwipedLeft(viewHolder.adapterPosition)
} else if (direction == ItemTouchHelper.END) {
adapter.onSwipedRight(viewHolder.adapterPosition)
}
}
override fun isLongPressDragEnabled(): Boolean {
return false
}
override fun isItemViewSwipeEnabled(): Boolean {
return !adapter.isMultiSelectionActive()
}
}
Комментарии:
1. Не могли бы вы добавить сюда свой код адаптера, пожалуйста?
2. поскольку элемент не удаляется из набора данных (при пролистывании вправо), попробуйте вызвать notifyItemChanged(viewholder.adapterposition).
Ответ №1:
Я добавил adapter.notifyItemChanged(position)
в конец onSwiped()
метода для достижения цели.
Поскольку набор данных не изменяется сам по себе, поэтому элемент все еще присутствует для адаптера, весь элемент вернется в исходное положение.
В вашем случае это было бы так:
override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
if (direction == ItemTouchHelper.START) {
adapter.onSwipedLeft(viewHolder.adapterPosition)
} else if (direction == ItemTouchHelper.END) {
adapter.onSwipedRight(viewHolder.adapterPosition)
}
adapter.notifyItemChanged(viewHolder.adapterPosition)
}