0

我有一个需要分页数据的功能。为此,我正在尝试使用 JetPack Paging 库。

我已经设置PageKeyDataSource并在示例中显示了看起来非常冗长的异步调用事件。特别是如果您必须多次调用才能创建列表。

相反,我已经有一个数据源可以进行多次调用,映射所有这些并返回一页项目的实时数据。

所以我在想类似下面的代码,但我想它需要 DataSource 中的观察者才能将列表传递给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>) {}
}

有任何想法吗?

4

1 回答 1

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)
}

于 2019-11-05T13:28:46.417 回答