首页 > 解决方案 > 访问 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)
        }
    }

有谁知道怎么了?

谢谢

标签: androidandroid-recyclerviewadapterviewmodel

解决方案


首先,您不应该在活动或片段之外初始化 viewModel。

我假设您不是onCreate在初始化阶段而是在初始化阶段创建适配器。有两个解决方案可以解决您的问题。

  1. 在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
   }
}
  1. 在方法中创建适配器onCreate,这也应该适合你。

干杯


推荐阅读