При перетаскивании элементов списка порядок остается прежним

Пишу свой ToDo List на Android (Kotlin) с сохранением в базе данных. Реализовал возможность перетаскивать элементы, меняя их местами. Однако, есть проблема. Для удобства сделал гифку:

  1. есть список с названиями: 1, 2, 3.
  2. меняю 1 и 2 местами.
  3. кликаю на 1, чтобы отредактировать.
  4. возвращаюсь к списку, но порядок вернулся к тому, который был до перетаскивания.

Если кто-то сталкивался с таким, буду рад помощи.введите сюда описание изображения


Ответы (1 шт):

Автор решения: Sergei Buvaka

Я думаю, что ваша проблема состоит в том, что вы неправильно храните сам список. Я конечно могу ошибаться т.к. вы не приложили кода, но смею предположить, что ваш список храниться (или получается) где-то или в самом адаптере или Activity.

Если вы хотите иметь актуальное состояние вашего экрана, то вам нужно позаботиться об актуальности данных. Самый простой способ это создать какую-то сущность (Presenter/ViewModel и т.п.) в которой будет храниться состояние экрана, в вашем случае это ваш список в нужном порядке.

Условно вы вошли на экран:

  1. Загрузили данные и передали их в ваша Adapter.
  2. После чего вы поменяли их местами. И тут важный момент, вы должны сделать замену не в адаптере, а в вашем Presenter/ViewModel и после чего заново обновить адаптер. Тут стоит реализовать DiffUtils, чтоб всякий раз не обновлять весь список.
  3. После того как вы вернулись на предыдущий экран вы просто снова подгружаете состояние из Presenter.

В целом это же можно сделать и через базу данных, а если вы используете RX Java то вы вообще можете просто подписать ваш адаптер на изменения в БД. И все изменения гонять через БД, так вы будете получать актуальное состояние даже после выгрузки приложения из памяти.

Но суть в том, что ваш UI не должен ничего знать о логике получения данных, он должен быть максимально тупым и единственной его ответственностью должно быть: "Рисование самого себя".

В то же время слой с логикой и данными не должен зависеть от вашего UI, и хранить в себе актуальное состояние независимо от того что и где открылось.

→ Ссылка