Как провести элемент из вида recycler, не удаляя его с экрана

#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)
    }
  

Пример записи с устройства