【问题标题】:SetOnClickListener for Button within RecyclerView to access viewmodel and perform action on room databaseSetOnClickListener 用于 RecyclerView 中的 Button 以访问 viewmodel 并对房间数据库执行操作
【发布时间】:2021-03-24 14:11:00
【问题描述】:

我想在 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()
    }

}

谢谢!

【问题讨论】:

  • 我不熟悉 Kotlin,但在 Java 中,SetOnClickListener 设置在 onBindViewHolder method 中。喜欢holder.button.setOnClickListener。试试看

标签: button android-recyclerview android-room viewmodel onclicklistener


【解决方案1】:

解决了通过 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()
}}

【讨论】:

    猜你喜欢
    • 2020-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多