Как включить перетаскивание и разрешить пользовательскую сортировку? - PullRequest
0 голосов
/ 13 февраля 2020

У меня есть RecyclerView, который представляет собой список введенных пользователем «шагов», и эти шаги могут быть в любом порядке, который пользователь хочет перетаскивать. У меня есть TextView, который показывает положение адаптера (порядок шагов), но мне трудно обновлять его после перетаскивания.

Используя ItemTouchHelper, у меня есть следующее:

override fun onMove(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder, target: RecyclerView.ViewHolder): Boolean
{
    val fromPosition = viewHolder.adapterPosition
    val toPosition = target.adapterPosition
    if(fromPosition < toPosition)
    {
        for(i in fromPosition until toPosition)
        {
            Collections.swap(data, i, i + 1)
            data[toPosition].number = toPosition.toLong()
            data[fromPosition].number = fromPosition.toLong()
        }
    }
    else
    {
        for(i in toPosition downTo fromPosition)
        {
            Collections.swap(data, i, i - 1)
            data[toPosition].number = toPosition.toLong()
            data[fromPosition].number = fromPosition.toLong()
        }
    }
    notifyItemMoved(fromPosition, toPosition)
    notifyItemChanged(toPosition)
    notifyItemChanged(fromPosition)
    return true
}

Но он генерирует исключение IndexOutOfBoundsException, если я перетаскиваю какой-либо элемент на первую позицию, и данные внутри EditText не сохраняются при перемещении или копируются в другой EditText.

Ответы [ 2 ]

0 голосов
/ 16 февраля 2020

РЕШЕНИЕ

Я был идиотом и пытался летать, прежде чем бежать. Приведенный выше код из этой статьи работал бы отлично, если бы я не модифицировал его перед тестированием и запуском, кроме вызова notifyItemChanged () после notifyItemMoved (), поскольку число зависит от позиции адаптера ViewHolder. Все, что мне нужно было сделать, это не ставить код после Collections.swap (). Теперь функция заказа работает отлично.

if (fromPosition < toPosition)
    {
        for (i in fromPosition until toPosition)
        {
            swap(data, i, i + 1)
        }
    } else
    {
        for (i in fromPosition downTo toPosition + 1)
        {
            swap(data, i, i - 1)
        }
    }
    notifyItemMoved(fromPosition, toPosition)
    notifyItemChanged(toPosition)
    notifyItemChanged(fromPosition)
    return true
0 голосов
/ 13 февраля 2020

Вы ошиблись, потому что l oop

for(i in toPosition downTo fromPosition)

должно быть

for(i in fromPosition downTo toPosition )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...