Допустим, есть простой сценарий:
user для хранения сведений о пользователеuser_images для хранения в поле image_path путей изображений в памяти телефона.В RecyclerView отображается список пользователей, и пользователь может провести пальцем, чтобы удалить строку. Адаптер представляет собой ListAdapter, а данные поступают из комнаты как LiveData.
Рабочий процесс, о котором я думал, выглядит так:
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 updatebleListadapter.submitList(updatebleList.toList())adapter.submitList(updatebleList.toList()).Как видите, для правильной отправки списков требуется много пересозданий. Есть ли лучший/более простой способ добиться этого?
вам все равно нужно удалить его из таблицы базы данных ... а затем вставить его снова, и тогда все автоматически появится снова (LiveData из запроса к базе данных и функция sumbit RecyclerView)
Я просто применил свайп для удаления функций в MainActivity, создав новый ItemTouchHelper(). Вы можете проверить пример кода на GitHub здесь.
У вас должно быть промежуточное представление ваших данных, содержащее состояние удаления. Потому что управлять этим в действии/фрагменте не место для этого.