Допустим, существует простой сценарий:
user
таблица для хранения пользовательских данных user_images
для хранения в поле image_path
путей к изображениямв памяти телефона.
В RecyclerView
показан список пользователей, и пользователь может провести пальцем, чтобы удалить строку.Адаптер является ListAdapter
, а данные из Room поступают как LiveData
Рабочий процесс, о котором я думал, выглядит следующим образом:
- удалите объект с измененными параметрами из адаптера и обновитев окне восстановления
- отображается опция Закуска с отменой
- на Закуске, если пользователь нажимает Отменить, повторно добавьте элемент в
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())
Как видите, существует много пересозданий списков для правильной отправки.Есть ли лучший / более простой способ добиться этого?