Как получить значение ViewModel от адаптера RecyclerView

У меня есть проект 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 из адаптера, а затем манипулировать им?

Если не можете этого сделать, любое предложение было бы неплохо.

Я думаю, мне не нужно публиковать код из моего класса Fragment, потому что я определяю свой адаптер из своего класса фрагмента самым распространенным способом recyclerView.adapter = PodAdapter(podList,context!!.applicationContext)

Giovanka Bisano 20.03.2019 16:59
3
1
1 376
2

Ответы 2

вы можете получить доступ к своей ViewModel из контекста, в который вы попадаете в адаптер.

Как это сделать? я пытаюсь context.viewModel.listUri.value и выдает ошибку

Giovanka Bisano 21.03.2019 01:29

Я предполагаю, что вместо передачи контекста в конструкторе вместо этого передайте 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)     
}

надеюсь, это поможет

Другие вопросы по теме