Принудительное обновление источника данных библиотеки подкачки

В моей ViewModel я загружаю данные, используя

private val pagingConfig = PagedList.Config.Builder()
    .setEnablePlaceholders(false)
    .setInitialLoadSizeHint(INITIAL_LOAD_SIZE_HINT)
    .setPageSize(PAGE_SIZE)
    .build()

val notificationList = LivePagedListBuilder<Long, Notification>(dataSourceFactory, pagingConfig).build()

Который отлично работает. Однако, когда мои данные изменяются, LiveData<PagedList<Notification>> не получает уведомления. Могу ли я что-нибудь сделать, чтобы вызвать LiveData обновление (ViewModel знает, когда происходит изменение).


comment
Для ответа: stackoverflow.com/a/51838015/2599596   -  person Naveen Kumar M    schedule 02.05.2019


Ответы (2)


Вы можете инициировать обновление данных с помощью метода invalidate() из файла DataSource.

При использовании библиотеки подкачки уровень данных должен уведомлять другие уровни вашего приложения, когда таблица или строка устаревают. Для этого вызовите invalidate() из класса DataSource, который вы выбрали для своего приложения.

Дополнительная информация: Уведомлять, когда данные недействительны

person Alexey Denysenko    schedule 07.11.2018
comment
Спасибо. Я попробовал маршрут .invalidate() еще до публикации, но он не делает то, что я хочу, и просто очищает весь источник данных. - person liminal; 08.11.2018
comment
@liminal, а что ты хочешь сделать? - person Alexey Denysenko; 08.11.2018
comment
.invalidate() должен вызвать повторную загрузку данных. Так что, если invalidate() не работает, то ваши данные на самом деле не изменились. - person EpicPandaForce; 17.12.2018

Согласно официальной документации: https://developer.android.com/topic/libraries/architecture/paging/data#notify-data-invalid

Вы должны позвонить dataSourceLiveData.value?.invalidate()

Я называю это с моей точки зрения следующим образом:

OnRefresh: View реализует SwipeRefreshLayout.OnRefreshListener

override fun onRefresh() {
    brewerViewModel.retry()
}

В определении обновления метода в моей модели представления:

fun refresh() {
    brewerDataSourceFactory.refresh()
}

В моем случае я использую модификацию для получения данных с сервера.

ItemResponse - это объект, который я получаю с сервера (модификация)

class DataSourceFactory : DataSource.Factory<Int, ItemResponse>() {

    lateinit var dataSource: DataSource
    var dataSourceLiveData: MutableLiveData<DataSource> =
        MutableLiveData<DataSource>()

    override fun create(): DataSource<Int, ItemResponse> {

        dataSource = DataSource()
        dataSourceLiveData.postValue(dataSource)
        return dataSource

    }

    fun refresh() {
        dataSourceLiveData.value?.invalidate()
    }
}

В моем DataSource определяется следующим образом:

class DataSource : PageKeyedDataSource<Int, ItemResponse>

Я надеюсь, что это помогает!

person Isaias Carrera    schedule 07.06.2020
comment
В моем случае не работает... что я делаю не так? Или какие могут быть пограничные случаи? Я разместил аналогичный вопрос, потому что я все еще не могу обновить данные из recyclerView с разбивкой на страницы... Какую версию вы используете? - person Amg91; 10.07.2020
comment
Привет @ Amg91. Не могли бы вы опубликовать исходный код? Так что мы можем это проверить. - person Isaias Carrera; 13.07.2020
comment
Заранее спасибо. stackoverflow.com/q/62840390/6723193 - person Amg91; 13.07.2020