我可以使用 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)
}