Могу ли я использовать Livedata для создания данных для PageKeyedDataSource? - PullRequest
0 голосов
/ 05 ноября 2019

У меня есть функция, которая требует выгружаемых данных. Для этого я пытаюсь использовать библиотеку JetPack Paging.

Я настроил PageKeyDataSource и в примерах он показывает события асинхронного вызова, которые выглядят довольно многословно. Особенно, если вам нужно сделать несколько вызовов для создания списка.

Вместо этого у меня уже есть источник данных, который выполняет несколько вызовов, сопоставляет все это и возвращает живые данные страницы элементов.

ИтакЯ думал что-то вроде приведенного ниже кода, но я думаю, что для источника, который должен быть передан в onResult

, необходимо получить наблюдателя в DataSource * (getsomeCars - liveData)

    override fun loadInitial(params: LoadInitialParams<String>, callback: LoadInitialCallback<String, Cars>) {

        callback.onResult(carsDataService.getSomeCars.value!!,null,"dsd")
        TODO("not implemented")
    }

    override fun loadAfter(params: LoadParams<String>, callback: LoadCallback<String, Cars>) {
        TODO("not implemented")
    }

    override fun loadBefore(params: LoadParams<String>, callback: LoadCallback<String, Cars>) {}
}

Есть идеи?

1 Ответ

0 голосов
/ 05 ноября 2019

Добавьте вспомогательный метод observeOnce к вашему классу PagedKeyedDataSource, который прослушивает единственное первое обновление объекта LiveData.

fun <T> LiveData<T>.observeOnce(observer: Observer<T>) {

        observeForever(object : Observer<T> {
            override fun onChanged(t: T?) {
                observer.onChanged(t)
                removeObserver(this)
            }
        })

    }

В вашем файле build.gradle уровня приложения. Добавьте это

implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.1.1'

Затем вызовите метод observeOnce для вашего LiveData объекта, который наблюдает только за первым обновлением вашего LiveData объекта, а затем вызывает callback.onSuccess.

GlobalScope.launch(Dispatchers.Main) {
    val observer = Observer<List<Cars>>{
        callback.onResult(it, null, "dsd")
    }
    yourLiveDataObj.observeOnce<List<Cars>>(observer)
}

РЕДАКТИРОВАТЬ

Вместо использования LiveData вы можете использовать интерфейсы для достижения той же цели. Объявите универсальный интерфейс

interface ApiCallback<T>{

    fun onSuccess(result: T)

    fun onFailure(errMsg:String)

}

В вашем PagedKeyDataSource

getSomeCars(object : ApiCallback<List<Cars>>{
            override fun onSuccess(result: List<Cars>) {   
                 callback.onResult(result, null, "dsd")
            }

            override fun onFailure(errMsg: String) {

                Log.w("get some cars failed with err: $errMsg")
            }
        })

В getSomeCars() функция

fun getSomeCars(apiCallback:ApiCallback<List<Cars>>){
    //after your multiple api calls call
    apiCallback.onSuccess(carListResults)
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...