Recyclerview с ListAdapter DiffCallback и Отменить при пролистывании - PullRequest
0 голосов
/ 31 января 2019

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

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

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

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

  1. удалите объект с измененными параметрами из адаптера и обновитев окне восстановления
  2. отображается опция Закуска с отменой
  3. на Закуске, если пользователь нажимает Отменить, повторно добавьте элемент в ListAdapter и обновите представление утилизатора.Если пользователь не нажимает кнопку «Отменить», а после перерыва закуска удаляется, удалите строки из 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())
  • в случае отмены, повторно добавить элемент в updatebleListand и отправить его сновакак новый список adapter.submitList(updatebleList.toList())

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

...