【问题标题】:How to get value from ViewModel fromRecyclerView Adapter如何从 RecyclerView Adapter 从 ViewModel 中获取价值
【发布时间】:2019-03-20 15:58:13
【问题描述】:

我在 MVVM 结构中有一个 Android 项目。在该项目中,包括 RecyclerView。这是我的代码。

1.MyViewModel.kt

class MyViewModel(context: Application, val myRepository: MyRepository) : AndroidViewModel(context), Observable{

    ... other code ...
    val listUri: MutableLiveData<MutableList<Uri>> by lazy {
        MutableLiveData<MutableList<Uri>>().apply {
            value = mutableListOf()
        }
    }
    ... other code ...

}

2.MyAdapter.kt

class MyAdapter(var items: MutableList<Uri>, val context: Context) : RecyclerView.Adapter<ViewHolder>() {

var listItems: ArrayList<Uri> = items as ArrayList<Uri>

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
    return ViewHolder(LayoutInflater.from(context).inflate(R.layout.pod_list_item, parent, false))
}

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
    holder.imageIcon.setImageURI(listItems[position])

    holder.deleteIcon.setOnClickListener {
        val viewModel: MyViewModel? = null
        ....THIS PART....
        viewModel?.listUri?.value.removeAt(position) 
        ....UNTIL THIS PART....     
    }
}

override fun getItemCount(): Int {
    return editedItems.size
}
}


class ViewHolder(val view: View) : RecyclerView.ViewHolder(view) {
    var imageIcon = view.icon_image
    var deleteIcon = view.icon_delete
}

当用户点击recyclerview项目中的删除图标时,应用程序假设删除MyViewModelMutableLiveData&lt;MutableList&lt;Uri&gt;&gt;的选定值listUri

在我上面标记的代码中,当我调试代码时,它返回 null 值,即使 ViewModel 中的变量 listUri 具有值。 所以我认为,我从 Adapter 访问 ViewModel 值的方式是错误的。

如何从适配器中获取 ViewModel 的值并对其进行操作?

如果不能这样做,任何建议都会很好。

【问题讨论】:

  • 我认为,我不需要从我的 Fragment 类发布代码,因为我以最常见的方式从我的 Fragment 类定义我的适配器recyclerView.adapter = PodAdapter(podList,context!!.applicationContext)

标签: android mvvm kotlin


【解决方案1】:

您可以从您进入适配器的上下文中访问您的 ViewModel。

【讨论】:

  • 怎么做?我尝试context.viewModel.listUri.value 它给了我错误
【解决方案2】:

我猜不是在构造函数中传递上下文,而是传递 ViewModel:

class MyAdapter(var items: MutableList<Uri>, val viewModel: MyViewModel) : RecyclerView.Adapter<ViewHolder>()

然后代替:

holder.deleteIcon.setOnClickListener {
    val viewModel: MyViewModel? = null
    ....THIS PART....
    viewModel?.listUri?.value.removeAt(position) 
    ....UNTIL THIS PART....     
}

你可以这样做:

holder.deleteIcon.setOnClickListener {
    viewModel.listUri.value?.removeAt(position)     
}

希望对你有帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-14
    • 2021-08-24
    • 2020-09-27
    • 1970-01-01
    • 2017-10-01
    • 2018-04-07
    • 2021-12-26
    相关资源
    最近更新 更多