我有一个需要分页数据的功能。为此,我尝试使用JetPack分页库。
已经设置了PageKeyDataSource
,并在示例中显示了看起来很冗长的异步调用事件。特别是如果您必须多次调用才能创建列表。
相反,我已经有一个数据源,该数据源可以进行多次调用,映射所有这些内容并返回项目页面的实时数据。
所以我在想类似下面的代码,但是我想它需要数据源中的观察者才能将列表传递到onResult
(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>) {}
}
有什么想法吗?
答案 0 :(得分:0)
向您的PagedKeyedDataSource类添加一个便捷方法observeOnce
,该类侦听对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)
}