Список не выдается при удалении элемента (RxKotlin)

Я работаю над приложением для 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, а затем удаленный элемент не отображался, как и должно быть. Итак, я думаю, проблема в том, что список не испускает изменения при удалении элемента.

Кто-нибудь знает способ решить эту проблему? Любая помощь приветствуется.

Спасибо!


person Sebastián Landínez García    schedule 20.06.2018    source источник


Ответы (1)


Вы должны использовать оператор отсрочки при создании наблюдаемого списка. Он возвращает список обновлений, когда вы подписались.

person gokhan    schedule 20.06.2018
comment
Привет, @gokhan, спасибо за ответ. Это означает, что мне придется несколько раз подписаться на наблюдателя? - person Sebastián Landínez García; 20.06.2018
comment
@SebastiánLandínezGarcía Нет, я имею в виду перенос вызываемого объекта с оператором отсрочки - person gokhan; 20.06.2018
comment
Я совсем новичок в библиотеке Rx. Означает ли это, что я должен сделать свою функцию listImages равной Observable.fromCallable {...}.defer? Или выполнить какую-то операцию компоновки? Спасибо! - person Sebastián Landínez García; 20.06.2018