我可以使用 Livedata 为 PageKeyedDataSource 创建数据吗?
Can I use Livedata to create data for a PageKeyedDataSource?
我有一个功能需要分页数据。为此,我正在尝试使用 JetPack Paging 库。
我已经设置 PageKeyDataSource
并且在示例中它显示了看起来非常冗长的异步调用事件。特别是如果您必须多次调用才能创建列表。
相反,我已经有一个数据源可以进行多次调用,映射所有这些和returns一页项目的实时数据。
所以我在想类似下面的代码,但我想它需要数据源中的观察者才能将列表传递给 onResult
(getsomeCars 是实时数据)
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>) {}
}
有什么想法吗?
向您的 PagedKeyedDataSource class 添加一个便捷方法 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'
然后在您的 LiveData
对象上调用 observeOnce
方法,它只观察您的 LiveData
对象的第一次更新,然后调用 callback.onSuccess。
GlobalScope.launch(Dispatchers.Main) {
val observer = Observer<List<Cars>>{
callback.onResult(it, null, "dsd")
}
yourLiveDataObj.observeOnce<List<Cars>>(observer)
}
EDIT
除了使用 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)
}
我有一个功能需要分页数据。为此,我正在尝试使用 JetPack Paging 库。
我已经设置 PageKeyDataSource
并且在示例中它显示了看起来非常冗长的异步调用事件。特别是如果您必须多次调用才能创建列表。
相反,我已经有一个数据源可以进行多次调用,映射所有这些和returns一页项目的实时数据。
所以我在想类似下面的代码,但我想它需要数据源中的观察者才能将列表传递给 onResult
(getsomeCars 是实时数据)
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>) {}
}
有什么想法吗?
向您的 PagedKeyedDataSource class 添加一个便捷方法 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'
然后在您的 LiveData
对象上调用 observeOnce
方法,它只观察您的 LiveData
对象的第一次更新,然后调用 callback.onSuccess。
GlobalScope.launch(Dispatchers.Main) {
val observer = Observer<List<Cars>>{
callback.onResult(it, null, "dsd")
}
yourLiveDataObj.observeOnce<List<Cars>>(observer)
}
EDIT
除了使用 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)
}