首页 > 解决方案 > 我可以在 RecyclerView.Adapter 中使用 ViewModelProvider 和 Observe 吗?

问题描述

我在此应用程序中使用 MVVM 和 RecyclerView,因此回收视图完美显示列表,但是当我将视图模型添加到适配器时,我在 logcat 中收到错误

您的活动尚未附加到应用程序实例。您不能在 onCreate 调用之前请求 ViewModel。

我是这个 MVVM 的新手,我知道这是可能的还是有其他方法可以做到这一点

这是我的带有 viewHolder 的适配器类

class KeefAdapter : RecyclerView.Adapter<KeefViewHolder>() {
    var dataOfAllKeef = listOf<String>()

    init {
        dataOfAllKeef = arrayListOf("Marijuwana" , "Bango" , "Weed" , "Hash")
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): KeefViewHolder {
        lateinit var binding: KeefSingleItemBinding

        binding = DataBindingUtil.inflate(LayoutInflater.from(parent.context) , R.layout.keef_single_item , parent , false)
        val viewModel:OrderYourKeefViewModel = ViewModelProvider(OrderYourKeef()).get(OrderYourKeefViewModel::class.java)
        binding.orderViewModelWithSingle = viewModel
        viewModel.count.observe(OrderYourKeef(), Observer { newCountOfHash->
            binding.root.theCountOfHash.text = newCountOfHash.toString()
        })

        return KeefViewHolder(binding.root)
    }

    override fun getItemCount() = dataOfAllKeef.size

    override fun onBindViewHolder(holder: KeefViewHolder, position: Int) {
        val item = dataOfAllKeef[position]
        holder.keefName.text = item

        if (item.equals("Marijuwana")) {
            holder.keefImage.setImageResource(R.mipmap.marijuana)
        } else if (item.equals("Bango")) {
            holder.keefImage.setImageResource(R.mipmap.bango)
        } else if (item.equals("Weed")) {
            holder.keefImage.setImageResource(R.mipmap.weed)
        } else if (item.equals("Hash")) {
            holder.keefImage.setImageResource(R.mipmap.hashesh)
        }
    }
}

class KeefViewHolder(itemView:View) : RecyclerView.ViewHolder(itemView) {
    var keefName:TextView = itemView.keefName
    var keefImage: ImageView = itemView.keefImage
    var increase: Button = itemView.increaseTheCount
    var decrease: Button = itemView.minusTheCount
    var theCountOfKeef: TextView = itemView.theCountOfHash
}

标签: androidkotlinmvvmandroid-recyclerviewandroid-livedata

解决方案


我认为这不是实现 MVVM 模式的正确方法。

你必须viewModel = ViewModelProviders在你的活动中调用。获取列表项后,将其传递给您的适配器并调用notifyDataSetChanged()

updateListItems(newListItems: List<YourItem>) {
    currentItems = newListItems
    notifyDataSetChanged()
}

在此处阅读有关它的更多信息


推荐阅读