android - 我可以在 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
}
解决方案
我认为这不是实现 MVVM 模式的正确方法。
你必须viewModel = ViewModelProviders
在你的活动中调用。获取列表项后,将其传递给您的适配器并调用notifyDataSetChanged()
:
updateListItems(newListItems: List<YourItem>) {
currentItems = newListItems
notifyDataSetChanged()
}
推荐阅读
- java - ImageMagic 检测图像是否有边框或框架
- python - 如何使用 matplotlib 绘制表格
- javascript - 在 React 中更改 document.getElementsByClassName("parent")[0].children
- html - Selenium - Java - Sendkeys 在文本字段中不起作用。没有错误
- google-cloud-platform - GCP - 如何使用免费积分和生产使用
- x86 - AVX-512 浮点比较和掩码
- javascript - 试图通过线性搜索循环数组
- python - 如何在不停止代码执行的情况下进行循环
- kubernetes - 为 Raspberry Pi 集群创建 Folding@Home 的 k8s 部署的好处?
- javascript - JS/CSS:除非在 setTimeout 内,否则不会发生转换