gpt4 book ai didi

android - Android LiveData : How to do an ArrayList>?

转载 作者:行者123 更新时间:2023-12-03 11:01:25 27 4
gpt4 key购买 nike

我正在创建具有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
}

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
}


谢谢,让我知道是否还有其他需要或困惑!

最佳答案

通过查看上面的代码,您试图从服务器获取每个表行的项目列表,并尝试将结果更新到回收者 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com