我可以使用Livedata为PageKeyedDataSource创建数据吗?

我有一个需要分页数据的功能。为此,我尝试使用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>,Cars>) {}
}

有什么想法吗?

sibo36158 回答:我可以使用Livedata为PageKeyedDataSource创建数据吗?

向您的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,"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)
}

本文链接:https://www.f2er.com/3159441.html

大家都在问