未解决的参考:textView

Unresolved reference: textView

我正在尝试创建一个 recyclerView,但是当我尝试引用我的 textView 时,我收到一条错误消息,显示未解决的引用:textViewTitle,我已经尝试了很多方法但我做不到,感谢您的明智帮助。

class RecyclerAdapter(private val userList: ArrayList<Sitios> = ArrayList()) :
    RecyclerView.Adapter<RecyclerAdapter.ViewHolder>() {

    inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView)

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val v = LayoutInflater.from(parent.context).inflate(R.layout.card_view, parent, false)

        return ViewHolder(v)
    }

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

        //Unresolved reference: textViewTitle
        holder.itemView.textViewTitle.text = userList[position].description
    }

    override fun getItemCount(): Int = userList.size

holder.itemView 是当 onCreateViewHolder 运行时传递给 ViewHolder class 的 View。这只是一个普通的 View,并且 class 中没有名为 textViewTitle 的字段,这就是您要用 holder.itemView.textViewTitle 引用的内容 - 这就是它说引用的原因未解决

您可能想要做的是 itemView 的层次结构 中找到具有该 ID 的 TextView,因此您需要做

holder.itemView.findViewById<TextView>(R.id.textViewTitle)

或者 ID 是什么。但通常情况下,人们会将字段放在 ViewHolder class 中,通过查找一次来设置它们,然后您就可以像尝试做的那样访问它们:

inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
    lateinit var textViewTitle : TextView
}

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
    val v = LayoutInflater.from(parent.context).inflate(R.layout.card_view, parent, false)
    // or you could make the TextView a val in the ViewHolder's constructor and just pass it in instead of setting it after creation
    val holder = ViewHolder(v)
    holder.textViewTitle = v.findViewById<TextView>(R.id.textViewTitle)
    return ViewHolder(v)
}

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
    // now the reference is a field on the ViewHolder
    holder.textViewTitle.text = userList[position].description
}

这样更好,因为 onBindViewHolder 会在每次新项目滚动到视图中时运行,所以您不想做很多 findViewById,因为您只能做一次


如果你像上面那样以实地方式进行操作,而不是使视图引用构造函数参数(当你有几个时可能会变得混乱)我会更像这样写:

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
    val v = LayoutInflater.from(parent.context).inflate(R.layout.card_view, parent, false)
    return ViewHolder(v).apply {
        textViewTitle = v.findViewById(R.id.textViewTitle)
        // and any other views you need to set up
    }
}

看起来很整洁,尤其是有几个视图!