有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java未解析引用: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

共 (1) 个答案

  1. # 1 楼答案

    holder.itemView是在onCreateViewHolder运行时传递给ViewHolder类的View。它只是一个普通的View,在这个类中没有名为textViewTitle的字段,这就是你试图用holder.itemView.textViewTitle引用的内容——这就是为什么它说引用是未解析的

    你可能想做的是itemView的层次结构中找到一个具有该ID的TextView,所以你需要这样做

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

    或者不管身份是什么。但通常情况下,人们会将字段放在ViewHolder类中,通过执行一次查找来设置字段,然后您可以像试图执行的那样访问它们:

    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
        }
    }
    

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