我正在创建具有MVVM架构的应用程序,但遇到了要在View中显示LiveData列表的问题。
在我的ViewModel中,我有一个getAll()函数,该函数使用Room从数据库中检索字符串列表。从那里,我得到了字符串并调用我的Retrofit函数以将每个字符串分别发送到返回对象的Web服务器。这是我的问题所在。
从我在网上看到的MVVM教程中,它们通常具有LiveData>样式,但是在这种情况下,因为我分别获取每个对象,所以它变成了List>,但是我认为这不是正确的方法,因为在我的View中我需要做一个ForEach循环来观察列表中的每个LiveData对象。
我尝试了其他解决方法,但是似乎没有用。有更好的方法吗?
DAO
@Query("SELECT * FROM table")
fun getAll(): LiveData<List<String>>
存储库
fun getAll(): LiveData<List<String>> {
return dao.getAll()
}
fun getRetrofitObject(s: String): LiveData<RetrofitObject> {
api = jsonApi.getRetrofitObjectInfo(s, API_KEY)
val retrofitObject: MutableLiveData<RetrofitObject> = MutableLiveData()
api.enqueue(object : Callback<RetrofitObject> {
override fun onFailure(call: Call<RetrofitObject>?, t: Throwable?) {
Log.d("TEST", "Code: " + t.toString())
}
override fun onResponse(call: Call<RetrofitObject>?, response: Response<RetrofitObject>?) {
if (response!!.isSuccessful) {
retrofitObject.value = response.body()
}
}
})
return retrofitObject
}
MainActivityViewModel(ViewModel)
var objectList ArrayList<LiveData<retrofitObject>> = ArrayList()
// This is getting objects using Retrofit
fun getRetrofitObject(s: String): LiveData<retrofitObject> {
return repo.getRetrofitObject(s)
}
// This is getting all the strings from the internal database
fun getAll(): ArrayList<LiveData<retroFitObject>> {
repo.getAll().value?.forEach {it ->
objectList.add(getRetrofitObject(it)) //How else would I be able to do this?
}
return objectList
}
MainActivity(视图)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
mainActivityViewModel.getAll().forEach {
it.observe(this, Observer {it ->
mainActivityViewModel.objectList.add(it) //Here is part of the issue since I don't want to use a forloop in the View
})
}
adapter.objectList = mainActivityViewModel.objectList
recyclerView.adapter = adapter
}
谢谢,让我知道是否还有其他需要或困惑的地方!
通过查看以上代码,您试图从服务器获取每个表行的项目列表,并尝试将结果更新到回收者视图。您的逻辑有点混乱。所以在你的活动..首先初始化你的适配器和recyclerview
然后调用您的viewmodel函数以获取表中的所有值,并进行循环以在后台调用网络线程功能并将这些值存储在活动数据对象中。
只需在您的活动/片段中观察此活动数据,然后将列表传递给适配器并通知它即可。通过此操作,只要您的活动数据发生更改,recyclerview也会反映该项目
您的代码的问题是,您被称为带有enque选项的改造网络功能及其后台线程进程。因此,代码不会等待网络完成。并且它将返回retrofitObject数据。但是它还没有得到数据。所以这会出错。