未解决的参考: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
}
}
看起来很整洁,尤其是有几个视图!
我正在尝试创建一个 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
}
}
看起来很整洁,尤其是有几个视图!