Android MVVM,具有多个活动的应用程序

3
我是安卓新手,正在使用Retrofit、Kodein和Kotlin的MVVM模式开发一个从服务器获取数据的应用。在我的应用中设置了导航抽屉,目的是当我点击导航抽屉中的项目时,在新的活动中显示RecyclerView。但是,当新的活动打开时,RecyclerView无法设置列表项。我在我的仓库类和ViewModel类中调试代码,发现它们已经接收到了数据。我在新活动中调试我的代码,发现ViewModel无法接收那些数据,并在ViewModel.observe旁边设置了一个无效的图标。
以下是我的仓库类:
 fun getdigitalproduct(): LiveData<List<DigitalProduct>>{
    val dpData:MutableLiveData<List<DigitalProduct>> = MutableLiveData<List<DigitalProduct>>()
    val apiClient = ApiClient()

    val call:Call<List<DigitalProduct>> = apiClient.getClient().create(ApiService::class.java).getdigitalproduct()
    call.enqueue(object : Callback<List<DigitalProduct>>{
        override fun onResponse(
            call: Call<List<DigitalProduct>>,
            response: Response<List<DigitalProduct>>
        ) {
            dpData.value = response.body()
        }

        override fun onFailure(call: Call<List<DigitalProduct>>, t: Throwable) {
             dpData.value = null
        }

    })
    return dpData
}

这是用于视图模型的

var repoDigitalProduct: LiveData<List<DigitalProduct>> = repositorys.getdigitalproduct()
fun getdigitalproduct(): LiveData<List<DigitalProduct>>{
    return repoDigitalProduct
 }

这是新活动的内容:
  private fun getDigitalProduct() {
    viewModel.getdigitalproduct().observe(this, Observer {
        digipro.addAll(it)
    })

这是Digipro:

var digipro: ArrayList<DigitalProduct> = ArrayList()

在新活动中,我在onCreate方法中使用了这段代码:
  viewModel = ViewModelProviders.of(this, factory).get(AllViewModel::class.java)
    getDigitalProduct()
    setdigitalProductRecycler()

我在MainActivity中也使用了ViewModelProvider.of代码。
这是为了设置数字产品的Recycler视图:
 private fun setdigitalProductRecycler() {
    val digiproRecycler = digital_product_recycler
    digiproRecycler.layoutManager =
        LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, true)
    digiproRecycler.adapter = DigitalProductAdapter(digipro)
}

我的代码在MainActivity中运行正常,但是当我尝试在新的Activity中运行时......我该怎么办?
2个回答

2

1
我之前使用了共享ViewModel,但它对我没有起作用。现在我明白了应该在ViewModel的observe方法中设置我的Recycler,现在一切都好了。 - Hassan

1
我将存储库和ViewModel放在伴生对象中,然后在该活动中调用MainActivity的ViewModel。
这是针对MainActivity的:
 companion object{
   val repositorys = AllRepositorys()
   var viewModel: AllViewModel = AllViewModel(repositorys)
}

这是为新活动而准备的:

lateinit var viewModel: AllViewModel

我可以帮您进行翻译。这段内容的意思是:将以下代码放在新活动的onCreate()方法中。
 viewModel = MainActivity.viewModel

更新

现在我通过为每个片段或活动创建视图模型来处理此问题。因为ViewModel旨在在Activity或Fragment的生命周期中存储和管理与UI相关的数据。


这不是正确的解决方案,因为您在伴生对象中创建视图模型和存储库时,它们将保留在内存中。 - Yehezkiel L

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接