我在MVVM Structure中有一个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项中的删除图标时,应用程序假设删除在MutableLiveData<MutableList<Uri>>
中名为MyViewModel
的{{1}}的选定值。 / p>
在上面标记的代码中,当我调试代码时,即使ViewModel中的变量listUri具有值,它也会返回 null 值。 所以我认为,从适配器访问ViewModel值的方法是错误的。
如何从适配器访问ViewModel的值,然后对其进行操作?
如果无法做到这一点,那么任何建议都是不错的。
答案 0 :(得分:0)
您可以从进入适配器的上下文访问ViewModel。
答案 1 :(得分:0)
我猜不是通过构造函数传递上下文,而是传递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)
}
我希望这对您有帮助