【问题标题】:Android Mvvm, app with more than one activityAndroid Mvvm,具有多个活动的应用程序
【发布时间】:2021-03-13 03:24:24
【问题描述】:

我是 android 新手,我正在开发一个应用程序,该应用程序使用 kotlin 中的改造和 kodein 和 MvvM 从服务器检索数据 我在我的应用程序中设置了一个导航抽屉,目的是当我点击导航抽屉的项目时 新活动打开,在此活动中我想显示 recyclerview 但是当新的活动打开 recyclerview 时无法在 recycler 上设置 listitem 我在我的存储库和 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
}

这是给 ViewModel 的

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 代码

这是给 setdigitalProductRecycler 的:

 private fun setdigitalProductRecycler() {
    val digiproRecycler = digital_product_recycler
    digiproRecycler.layoutManager =
        LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, true)
    digiproRecycler.adapter = DigitalProductAdapter(digipro)
}

我的代码在 Mainactivity 中有效,但当我在新活动中尝试时......

我该怎么办?

【问题讨论】:

    标签: java android kotlin mvvm retrofit2


    【解决方案1】:

    我将存储库和视图模型放在伴随对象中,然后我在该活动中调用 MainActivity 的视图模型

    这是给 MainActivty 的:

     companion object{
       val repositorys = AllRepositorys()
       var viewModel: AllViewModel = AllViewModel(repositorys)
    }
    

    这是给newActivity的:

    lateinit var viewModel: AllViewModel
    

    我把这个放在新活动的 oncreate() 方法中:

     viewModel = MainActivity.viewModel
    

    更新

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

    【讨论】:

    • 这不是正确的解决方案,因为您的视图模型和存储库将保留在内存中,因为您在伴随对象中创建它
    【解决方案2】:

    解决此问题的最佳方法是在活动中创建视图模型,或者您可以使用共享视图模型。因此,您的视图模型将保留为您的活动保留

    https://stackoverflow.com/a/52611554/8868638

    【讨论】:

    • 我以前使用过共享视图模型,但它对我不起作用现在我明白我应该在 viewmodel.observe 方法中设置我的回收器,现在它很好
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-18
    • 1970-01-01
    • 2023-03-20
    • 2015-03-29
    • 1970-01-01
    相关资源
    最近更新 更多