- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在创建具有MVVM架构的应用程序,但遇到了一个问题:获取要在View中显示的LiveData列表。
在我的ViewModel中,我有一个getAll()函数,该函数使用Room从数据库中检索字符串列表。从那里,我得到了字符串并调用我的Retrofit函数,将每个字符串分别发送到返回对象的Web服务器。这是我的问题发生的地方。
从我在网上看到的MVVM教程中,它们通常具有LiveData>样式,但是在这种情况下,由于我逐个获取每个对象,因此它变为List>,但是我认为这不是正确的做法,因为在我的View中,需要执行一个ForEach循环来观察列表中的每个LiveData对象。
我尝试了其他解决方法,但似乎没有用。有更好的方法吗?
道
@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
}
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
}
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
}
最佳答案
通过查看上面的代码,您试图从服务器获取每个表行的项目列表,并尝试将结果更新到回收者 View 。您的逻辑有点困惑。
所以在你的 Activity ..首先初始化你的适配器和recyclerview
然后,调用viewmodel函数以获取表中的所有值,并进行循环以在后台调用网络线程功能,并将这些值存储在实时数据对象中。
只需在您的 Activity /片段中观察此 Activity 数据,然后将列表传递给适配器并通知它即可。通过此操作,每当您的 Activity 数据发生更改时,recyclerview也会反射(reflect)该项目
代码的问题是,您被称为带有enque选项的改造网络功能及其后台线程进程。因此,代码不会等待网络完成。并且它将返回RetrofitObject数据。但是它还没有得到数据。所以这会出错。
关于android - Android LiveData : How to do an ArrayList<LiveData<RetrofitObject>>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62107265/
我是一名优秀的程序员,十分优秀!