Обновить текущую страницу или обновить данные в библиотеке Paging 3 Android Kotlin

Я новичок в библиотеке Paging 3 в android kotlin. Я хочу безлимитный трафик. Итак, я обнаружил, что в моем случае полезна библиотека Paging 3. Я использовал PagingSource для создания списка. Я не использую Room. У меня есть вложенный recyclerView. Я использую PagingDataAdapter с diff util для моего Recyclerview. Я использовал рекомендованный учебник для библиотеки подкачки из codelab, и мне это удалось без каких-либо проблем. Я столкнулся с трудностями при обновлении элемента. Я использовал источник подкачки для создания списка, а внутри списка у меня есть некоторые данные, которые поступают с сервера. Я полностью все это без проблем. Но как обновить адаптер или уведомить данные изменились в reyclerview. У меня уже есть механизм для получения обновленного списка. Я искал, как обновить адаптер в каком-то месте, но везде упоминается использование invalidate () из DataSource. Источник данных используется в подкачке 2, верно ?. Теперь это находится внутри Paging 3 согласно документации в Перейти на Paging 3 < / а>. Я использовал Flow для получения данных. Этот код находится внутри класса viewmodel.

fun createRepo(data: List<String>, repository: RepositoryData): Flow<PagingData<UnlimitData>> {
    return repository.getStreamData(data).cachedIn(viewModelScope)
}

Я передаю список, который исходит из sever. Функция getStreamData возвращает элементы с данными типа int и string. Мои данные класс

data class UnlimitData(val id: Int, val name: String)

createRepo вызывает мой класс активности для отправки данных в adpater.

lifecycleScope.launch {
        viewModel.createRepo(serverData,repository).collectLatest { data ->
            adapter.submitData(data)
        }
}

Это мой код адаптера: -

class unlimitedAdapter() :
    PagingDataAdapter<UnlimitData, RecyclerView.ViewHolder>(COMPARATOR) {

override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
    val item = getItem(position)
    if (item != null) {
        (holder as UnlimitedViewHolder).bind(item)
    }
}

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
    return UnlimitedViewHolder.create(parent)
}

companion object {
    private val COMPARATOR = object : DiffUtil.ItemCallback<UnlimitData>() {
        override fun areItemsTheSame(oldItem: UnlimitData, newItem: UnlimitData): Boolean =
            oldItem.id == newItem.id

        override fun areContentsTheSame(oldItem: UnlimitData, newItem: UnlimitData): Boolean = oldItem == newItem
    }
}

}

Я добавил логику для вставки / обновления данных в список с помощью RetroFit. Мой список успешно обновлен, но я не могу обновить reyclerview.

Заранее спасибо.


person vivek modi    schedule 06.11.2020    source источник


Ответы (1)


Чтобы пейджинг мог подбирать новые элементы, вам нужно будет позвонить PagingSource.invalidate(), чтобы сообщить Pager, что ему необходимо получить новый PagingSource и перезагрузить страницы. Вы захотите отслеживать все PagingSource, которые производит ваша фабрика, и делать их недействительными каждый раз, когда вы обновляете резервный набор данных из сети.

РЕДАКТИРОВАТЬ: что-то вроде этого, но это очень грубый прототип

abstract class InvalidatingPagingSourceFactory<K,V> : () -> PagingSource<K,V> {
    private val list = mutableListOf()

    abstract fun create()

    override final fun invoke() {
        create().also { list.add(it) }
    }

    fun invalidate() {
        while (list.isNotEmpty()) { list.removeFirst().invalidate() }
    }
}
person dlam    schedule 07.11.2020
comment
Привет @dlam, спасибо за ответ. Не могли бы вы подробно объяснить мне, как отслеживать все PagingSource. Я новичок в библиотеке подкачки. Спасибо - person vivek modi; 08.11.2020
comment
В PagingSourceFactory, который вы передаете Pager, вам понадобится что-то, что хранит список ссылок на PagingSource, которые вы создаете, и имеет какой-то обратный вызов, который сообщает вам, когда ваш вспомогательный набор данных изменяется и делает недействительным + очищает этот список. Некоторые примеры кода с этой ошибкой могут помочь вам начать работу: Issuetracker.google.com/160716447 - person dlam; 10.11.2020
comment
Привет, @dlam, спасибо за ответ. Могу я получить более наглядный рабочий пример. - person vivek modi; 11.11.2020
comment
Вы переходили по ссылке? - person dlam; 12.11.2020