我正在学习使用 RecyclerView
虽然我的应用程序可以工作(目前!),但有两件事我不明白,我希望有人能帮助我理解。
以下是我的ViewHolder声明。
class AAAViewHolder ( view: View, var aaa: AAA? = null) : RecyclerView.ViewHolder (view) {...}
class BBBViewHolder (val view: View, var bbb: BBB? = null) : RecyclerView.ViewHolder (view) {...}
class CCCViewHolder ( view: View, var ccc: CCC? = null) : RecyclerView.ViewHolder (view) {...}
为什么我的ViewHolder BBBViewHolder
有余 val
? 如果我把它删除,那么我就会在 onBindViewHolder
的ViewAdapter类中。为什么?而且,如果我**添加了 val
声明到AAA和CCC,Android Studio告诉我不需要,并主动帮我删除。
接下来,有一些奇怪的事情,关于 onBindViewHolder
函数...
AAAListAdapter.kt (不显示) getItemCount
或 onCreateViewHolder
):
class AAAListAdapter : RecyclerView.Adapter<AAAViewHolder>() {
override fun onBindViewHolder(holder: AAAViewHolder, position: Int) {
val aaa = aaaList[position]
holder.itemView.aTextView.text = "AAA"
holder.aaa = aaa
}
}
BBBListAdapter.kt
class BBBListAdapter : RecyclerView.Adapter<BBBViewHolder>() {
override fun onBindViewHolder(holder: BBBViewHolder, position: Int) {
val bbb = bbbList[position]
holder.view.bTextView.text = "BBB"
holder.bbb = bbb
}
}
CCCListAdapter.kt
class CCCListAdapter : RecyclerView.Adapter<CCCViewHolder>() {
override fun onBindViewHolder(holder: CCCViewHolder, position: Int) {
val ccc = cccList[position]
holder.itemView.cTextView.text = "CCC"
holder.ccc = ccc
}
}
代码几乎是一样的,只是为什么BBBListAdapter要引用 holder.view
而另外两个则是指 holder.itemView
? 这些属性在哪里声明?我可以控制吗?我更希望它们是一样的...。
看A &C的动作是一样的,但B却不一样,我猜这两个问题是有关系的,但我不知道...。
(想加标签android-onbindviewholder,但是我的信誉度不够。)。
首先,你在构造函数中声明valvar,以便在类中的某个地方使用这些值,而无需在类中的任何地方声明或初始化它。举个例子,我想在适配器中使用一个列表,我会把它传到适配器中,而在适配器中我不会使用valvar,我不能使用它,除非我事先创建一个变量,并在它的默认构造函数中初始化它。
class A() {
lateinit var view : View
constructor(view : View) {
this.view = view
}
view.textView.text = "Redundant Code"
}
现在你可以通过在构造函数中声明它来减少这种情况。
class A(val view : View) {
view.textView.text = "Easy way"
}
现在来到你的用例,viewholder A和C是相同的,B中声明了view,你正在使用它,但是从适配器中的代码来看,我认为没有必要,同样的逻辑可以在适配器B中使用,holder.itemView.something,holder.itemView最终是你在A和C中使用的view对象,所以val view在这个特殊情况下是不需要的。
如果你在某处使用,那就把整个代码加进去,那里我也许能帮你解决为什么ViewHolder B不一样的问题。但从你发布的内容来看,没有必要在构造函数里面使用val。