Вы правы в том, что DataSource
предназначен для хранения неизменяемых данных.
Я считаю, что это потому, что Room and Paging Library стараются принимать более взвешенные дизайнерские решения и отстаивают неизменные данные.
Именно поэтому в официальных документах есть раздел для обновления или изменения вашего набора данных, который должен сделать недействительным источник данных при таком изменении.
Обновление выгружаемых данных : Если у вас есть более детализированные сигналы обновления, такие как сетевой API, сигнализирующий об обновлении одного элемента в списке, рекомендуется загружать данные из сети в память. Затем представьте эти данные в PagedList через DataSource, который оборачивает снимок в памяти. Каждый раз, когда изменяется копия в памяти, аннулируется предыдущий источник данных, и может быть создан новый источник, содержащий новое состояние моментального снимка.
Источник: https://developer.android.com/reference/android/arch/paging/DataSource
Имея это в виду, я полагаю, что решить проблему, которую вы описали, можно за пару шагов.
Это может быть не самый чистый способ, так как включает 2 шага.
Вы можете получить ссылку на снимок, который содержит PagedList, тип MutableList
. Затем вы можете просто удалить или обновить элемент внутри этого снимка, не аннулируя источник данных.
Тогда вторым шагом будет вызов чего-то вроде notifyItemRemoved(index)
или notifyItemChanged(index)
.
Поскольку вы не можете заставить DataSource уведомлять наблюдателей об изменении, вам придется сделать это вручную.
pagedList.snapshot().remove(index) // Removes item from the pagedList
adapter.notifyItemRemoved(index) // Triggers recyclerview to redraw/rebind to account for the deleted item.
Возможно, в вашем DataSource.Factory
найдется лучшее решение.
Согласно официальным документам, ваш DataSource.Factory
должен генерировать новый PagedList
после обновления данных.
Обновление постраничных данных : Чтобы отобразить данные из источника, который предоставляет обновления, вы можете создать DataSource.Factory, где каждый созданный DataSource становится недействительным, когда происходит обновление набора данных, которое делает текущий снимок недействителен. Например, при разбиении на страницы запроса из базы данных и запрашиваемая таблица вставляет или удаляет элементы. Вы также можете использовать DataSource.Factory для предоставления нескольких версий списков с разбивкой по сети. Если для получения новой версии данных требуется перезагрузить весь контент (например, в ответ на действие, такое как свайп для обновления), вы можете подключить явный сигнал обновления для вызова invalidate () в текущем DataSource.
Источник: https://developer.android.com/reference/android/arch/paging/DataSource
Однако я не нашел хорошего решения для этого второго подхода.