android - 访问 Recycler´s Adapter 中的 ViewModel
问题描述
我遇到的问题是,我想在 RecyclerView 的适配器中访问我的 ViewModel,但我有例外:“您的活动尚未附加到应用程序实例。您无法在 onCreate 调用之前请求 ViewModel”
class FoodInSortAdapter( val activity:MainActivity,private val list:List<String>):RecyclerView.Adapter<FoodInSortAdapter.Holder>() {
val viewModel :FoodViewModel by lazy {
println("servus")
ViewModelProvider(activity).get(FoodViewModel::class.java)}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): Holder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.sortitem, parent, false)
return Holder(view)
}
override fun onBindViewHolder(holder: Holder, position: Int) {
holder.sortName.text = list[position]
holder.itemView.setOnClickListener {
val m=list[position]
viewModel.setQuery(m)
}
}
有谁知道怎么了?
谢谢
解决方案
首先,您不应该在活动或片段之外初始化 viewModel。
我假设您不是onCreate
在初始化阶段而是在初始化阶段创建适配器。有两个解决方案可以解决您的问题。
- 在activity中初始化vm,并在adapter中通过新添加的方法设置,在中
setupViewModel
调用onCreate
。那是更好的一个。
class FooActivity : Activity{
private val viewModel: FoodViewModel by lazy {
println("servus")
ViewModelProvider(activity).get(FoodViewModel::class.java)
}
private val adapter = FoodInSortAdapter(emptyList())
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
adapter.setupViewModel(viewModel)
}
}
class FoodInSortAdapter(private val list:List<String>):RecyclerView.Adapter<FoodInSortAdapter.Holder>() {
private lateinit var viewModel: FoodViewModel
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): Holder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.sortitem, parent, false)
return Holder(view)
}
override fun onBindViewHolder(holder: Holder, position: Int) {
holder.sortName.text = list[position]
holder.itemView.setOnClickListener {
val m=list[position]
viewModel.setQuery(m)
}
}
fun setupViewModel(vm: FoodViewModel){
viewModel = vm
}
}
- 在方法中创建适配器
onCreate
,这也应该适合你。
干杯
推荐阅读
- c++ - VS Code c/cpp automatically includes hpp file
- php - why are two paragraphs being added on wordpress custom excerpt function used?
- laravel - how do I get the number of recorded complaints , and the number of checked and unchecked rows per each month in 2020 using laravel?
- python - How do I select information from a given block using pyparsing?
- reactjs - 如何在本机反应中对 svg 图像进行灰度化?
- c++ - 基于窗口位置的 Direct X 裁剪位图并将其渲染回窗口
- postgresql - SQL 错误:错误:未处理所有令牌
- python - 无法在 TensorFlow 中完全分离模型的输出
- laravel - 'composer require jenssegers/mongodb' 将 MongoDB 添加到新的 Laravel 7 项目时出错
- amazon-web-services - 预定义组的 AWS S3 对象级 ACL