Recyclerview с ListAdapter DiffCallback и опцией отмены при пролистывании

Допустим, есть простой сценарий:

  • Таблица user для хранения сведений о пользователе
  • user_images для хранения в поле image_path путей изображений в памяти телефона.

В RecyclerView отображается список пользователей, и пользователь может провести пальцем, чтобы удалить строку. Адаптер представляет собой ListAdapter, а данные поступают из комнаты как LiveData.

Рабочий процесс, о котором я думал, выглядит так:

  1. удалите удаленный элемент из адаптера и обновите recyclerview
  2. показать закуску с опцией отмены
  3. на Snack, если пользователь нажимает Undo, повторно добавляет элемент в ListAdapter и обновляет recyclerview. Если пользователь не нажимает «Отменить» и «Закуска» закрывается по истечении времени ожидания, удалите строки из user, user_images, а также удалите все изображения из хранилища, относящиеся к user_images, в image_path.

...

override fun onSwiped(...){
  val deletedItem = listAdapter.currentList.get(index)

  //REMOVE FROM THE ADAPTER HERE

  val snack = Snackbar.make(...)
  snack.setAction(...){
      //RE-ADD TO ADAPTER HERE
  }

  snack.addCallback(...){
    override fun onDismissed(...){
       //do the actual deletes
    }
  }

}

...

Проблема заключается в использовании ListAdapter. Как вы, возможно, знаете, он использует DiffCallBack для управления обновлениями представления, а вызов adapter.submitList(list) не вызывает никаких обновлений, поскольку он получает тот же список. (ListAdapter не обновляет элемент в reyclerview) Итак, чтобы иметь возможность удалить элемент, мне нужно:

  • получить currentList адаптера как Mutable updatebleList
  • удалить элемент из updatebleList
  • повторно подать список на адаптер adapter.submitList(updatebleList.toList())
  • в случае отмены повторно добавьте элемент в список обновлений и снова отправьте его как новый список adapter.submitList(updatebleList.toList()).

Как видите, для правильной отправки списков требуется много пересозданий. Есть ли лучший/более простой способ добиться этого?

У вас должно быть промежуточное представление ваших данных, содержащее состояние удаления. Потому что управлять этим в действии/фрагменте не место для этого.

Rajar 06.02.2019 15:40

вам все равно нужно удалить его из таблицы базы данных ... а затем вставить его снова, и тогда все автоматически появится снова (LiveData из запроса к базе данных и функция sumbit RecyclerView)

user924 03.10.2019 00:09
1
2
974
1

Ответы 1

Я просто применил свайп для удаления функций в MainActivity, создав новый ItemTouchHelper(). Вы можете проверить пример кода на GitHub здесь.

Другие вопросы по теме