Я работаю над приложением для Android. У меня есть список фотографий, загруженных в память. Я хочу использовать библиотеку Reactive, поэтому я объявляю источник данных в памяти, где я сохраняю список:
@Singleton
class MemoryPhotosSource @Inject constructor() {
var photos: MutableList<Image> = mutableListOf()
...
// Here is my function to add items to list.
fun addPhoto(image: Image) {
photos.add(image)
}
// Here is my function to list the items.
fun listPhotos(): List<Image> = photos
// Here is my function to remove items from list.
fun removePhoto(image: Image): Image {
photos.remove(image)
return image
}
}
Затем у меня есть ViewModel, где я вызываю эти методы:
class CreateDocumentFromPhotosViewModel @Inject constructor(): ViewModel() {
@Inject
lateinit var source: MemoryPhotosSource
fun listImages(): Observable<List<Image>> = Observable.fromCallable {
source.listPhotos()
}.applySchedulers()
fun addImage(image: Image) {
source.addPhoto(image)
}
fun removeImage(image: Image): Image {
source.removePhoto(image)
return image
}
}
Наконец, я подписываюсь в своем приложении:
dis add viewModel.listImages()
.subscribe {
adapter.data = it
}
dis add onDelete
.map { viewModel.removeImage(it) }
.map { showSnackbar(parentView, resources.getString(R.string.document_removed), resources.getString(R.string.undo), it)}
.map { it.subscribe { viewModel.addImage(it) } }
.subscribe()
Список и добавление изображений работают хорошо. Однако, когда я нажимаю кнопку удаления, которая публикуется в теме onDelete, отображается закусочная, но никаких изменений в адаптере RecyclerView не происходит. Во время отладки я заметил, что функция removePhoto
вызывается в классе MemoryPhotosSource
, и список успешно модифицируется. Однако он не выдает изменений, поэтому RecyclerView не обновляется. Я подтвердил это поведение, выйдя из приложения и войдя снова, что вызвало перерисовку Recycler, а затем удаленный элемент не отображался, как и должно быть. Итак, я думаю, проблема в том, что список не испускает изменения при удалении элемента.
Кто-нибудь знает способ решить эту проблему? Любая помощь приветствуется.
Спасибо!