首页 > 解决方案 > SetOnClickListener 用于 RecyclerView 中的 Button 以访问 viewmodel 并对房间数据库执行操作

问题描述

我想在 RecyclerView 中添加一个“删除”按钮,显示房间数据库中存在的“用户”列表。单击按钮时,该按钮应允许删除单个用户。我试图在 Myviewholder 中插入一个函数,但是当我在 OnBindViewHolder 中调用它时,错误涉及 mUserViewModel 的初始化。你有什么建议吗?这是适配器:

class ListAdapterUser: RecyclerView.Adapter<ListAdapterUser.MyViewHolder>() {

    private var UserList = emptyList<User>()
    private lateinit var mUserViewModel: UserViewModel


    class MyViewHolder(itemView: View): RecyclerView.ViewHolder(itemView) {

        val button = itemView.findViewById<Button>(R.id.deleteoption)

        fun deleteitem(item: User, viewModel: UserViewModel){
            button.setOnClickListener{
                viewModel.deleteUser(item)
        }}
    }


    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
        return MyViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.custom_rowUser, parent, false))
    }

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

    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
        val currentItem = UserList[position]
        holder.itemView.textview_valueUser.text = currentItem.Uservalue.toString()

        holder.deleteitem(currentItem, mUserViewModel)

    }

    fun setUserData(User: List<User>){
        this.UserList = User
        notifyDataSetChanged()
    }

}

谢谢!

标签: buttonandroid-recyclerviewandroid-roomviewmodelonclicklistener

解决方案


解决了通过 setUserData 函数获取在片段中初始化的视图模型。这里是最终代码:

class ListAdapterUser: RecyclerView.Adapter<ListAdapterUser.MyViewHolder>() {

private var UserList = emptyList<User>()
private lateinit var mUserViewModel: UserViewModel


class MyViewHolder(itemView: View): RecyclerView.ViewHolder(itemView) {

    val button = itemView.findViewById<Button>(R.id.deleteoption)

    fun deleteitem(item: User, viewModel: UserViewModel){
        button.setOnClickListener{
            viewModel.deleteUser(item)
    }}
}


override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
    return MyViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.custom_rowUser, parent, false))
}

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

override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
    val currentItem = UserList[position]
    holder.itemView.textview_valueUser.text = currentItem.Uservalue.toString()

    holder.deleteitem(currentItem, mUserViewModel)

}

fun setUserData(User: List<User>, viewModel: UserViewModel)){
    this.UserList = User
    this.mUserViewModel = viewModel
    notifyDataSetChanged()
}}

推荐阅读