У меня есть проект Android в структуре MVVM. В этом проекте есть 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, имя которого listUri.
В моем отмеченном выше коде, когда я отлаживаю код, он возвращает значение нулевой, хотя переменная listUri в ViewModel имеет значение. Поэтому я думаю, что мой способ доступа к значению ViewModel из адаптера неверен.
Как получить доступ к значению ViewModel из адаптера, а затем манипулировать им?
Если не можете этого сделать, любое предложение было бы неплохо.
вы можете получить доступ к своей ViewModel из контекста, в который вы попадаете в адаптер.
Как это сделать? я пытаюсь context.viewModel.listUri.value и выдает ошибку
Я предполагаю, что вместо передачи контекста в конструкторе вместо этого передайте 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)
}
надеюсь, это поможет
Я думаю, мне не нужно публиковать код из моего класса Fragment, потому что я определяю свой адаптер из своего класса фрагмента самым распространенным способом
recyclerView.adapter = PodAdapter(podList,context!!.applicationContext)