【问题标题】:How to use ViewModel in RecyclerView correctly?如何在 RecyclerView 中正确使用 ViewModel?
【发布时间】:2021-01-14 12:32:01
【问题描述】:

此行错误adapter = ItemAdapter(applicationContext,userViewModel.getListUsers())

**因为适配器参数context:Context,arrayList:ArrayList(但不是MutableLiveData)**

我不知道该怎么办,我也不完全确定我是否正确使用了 LiveData。

我的适配器

class ItemAdapter(var context: Context, private var arrayList: ArrayList<NumberModel>):RecyclerView.Adapter<ItemAdapter.ItemHolder>() {

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemHolder{

    val itemHolder = LayoutInflater.from(parent.context).inflate(
        R.layout.grid_layout_list_item,
        parent,
        false
    )
    return ItemHolder(itemHolder)
}

override fun onBindViewHolder(holder: ItemHolder, position: Int) {

    var positionOfNumber:NumberModel = arrayList.get(position)
    holder.textOfNumber.text = positionOfNumber.numberOfElement

   holder.button.setOnClickListener {
       var positionForDelete = holder.adapterPosition
       arrayList.removeAt(positionForDelete)
       notifyItemRemoved(positionForDelete)
       notifyItemRangeChanged(positionForDelete,arrayList.size)
   }
}

override fun getItemCount(): Int {
    return arrayList.size
}

class ItemHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
    var textOfNumber = itemView.findViewById<TextView>(R.id.numberTextView)
    var button:Button = itemView.findViewById(R.id.buttonClick)
}

}

MainActivity

recyclerView = findViewById(R.id.recyclerViewList)

    gridLayoutManager = GridLayoutManager(applicationContext,2,LinearLayoutManager.VERTICAL,false)
    recyclerView?.layoutManager = gridLayoutManager
    recyclerView?.setHasFixedSize(true)
    recyclerView?.adapter = adapter

    userViewModel.getListUsers().observe(this, Observer {
        it?.let {
            adapter = ItemAdapter(applicationContext,userViewModel.getListUsers())
        }
    })
}

视图模型

class MainActivityViewModel : ViewModel() {
var elementsList: MutableLiveData<ArrayList<NumberModel>> = MutableLiveData()

init {
    elementsList.value = setElements()
}

fun getListUsers() = elementsList

private fun setElements() : ArrayList<NumberModel> {
    var itemArrayList:ArrayList<NumberModel> = ArrayList()
    itemArrayList.add(NumberModel("1"))
    itemArrayList.add(NumberModel("2"))
    itemArrayList.add(NumberModel("3"))
    itemArrayList.add(NumberModel("4"))
    itemArrayList.add(NumberModel("5"))
    itemArrayList.add(NumberModel("6"))
    itemArrayList.add(NumberModel("7"))
    itemArrayList.add(NumberModel("8"))
    itemArrayList.add(NumberModel("9"))
    itemArrayList.add(NumberModel("10"))
    return itemArrayList
}

【问题讨论】:

    标签: android kotlin android-recyclerview android-livedata


    【解决方案1】:

    Because the adapter parameters context: Context, arrayList: ArrayList (but not MutableLiveData) 出现此错误的原因。 我们传递的是 MutableLiveData 而不是 ArrayList。所以我们需要将 ArrayList 作为第二个参数传递。

    userViewModel.getListUsers().observe(this, Observer {
            it?.let { list->
                adapter = ItemAdapter(applicationContext,list)
            }
        })
    

    userViewModel.getListUsers() 将给出 ArrayList,因此我们可以通过它来获取 ItemAdapter 的实例

    我们可以给thisrequireActivity()而不是传递applicationContext(将给出MainActivity上下文), 如果我们传递 applicationContext,我们可能会导致 memory leak 我们必须将正确的上下文传递给对象。

    【讨论】:

      猜你喜欢
      • 2017-05-08
      • 1970-01-01
      • 2022-09-29
      • 2020-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-20
      相关资源
      最近更新 更多