与RecyclerViews、ViewHolders和onBindViewHolder不一致。

问题描述 投票:0回答:1

我正在学习使用 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 (不显示) getItemCountonCreateViewHolder):

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,但是我的信誉度不够。)。

android-studio android-recyclerview android-viewholder
1个回答
1
投票

首先,你在构造函数中声明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。

© www.soinside.com 2019 - 2024. All rights reserved.