我不明白为什么在子类定义中涉及到公共方法
class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView)
RecyclerView.ViewHolder的源代码
public abstract static class ViewHolder {
public ViewHolder(View itemView) {
if (itemView == null) {
throw new IllegalArgumentException("itemView may not be null");
}
this.itemView = itemView;
}
答案 0 :(得分:2)
您的问题是,为什么以下代码似乎在ViewHolder
中调用公共方法RecylcerView
。这是您的代码,稍加重命名即可使事情更清晰:
class MyClass(itemView: View) : RecyclerView.ViewHolder(itemView)
您的描述中缺少的是显示外部类:
class RecyclerView { // outer/containing class
static class ViewHolder { // nested class
public ViewHolder(ViewItem view) { // constructor
// ... constructor body
}
}
}
现在查看该嵌套,要谈论ViewHolder
类,您需要将其引用为RecyclerView.ViewHolder
。然后,如果要构造一个实例,则必须添加构造函数参数,例如在Java中:
new RecyclerView.ViewHolder(view);
在Kotin中,当您从某个类派生时,构造函数必须调用super构造函数,而这样做的捷径就是在声明中执行该操作。
class MyClass(ViewItem view) : RecyclerView.ViewHolder(view) {
// ...class body
}
这表示MyClass
源自ViewHolder
,它是RecyclerView
的嵌套类,并且进入MyClass
构造函数的构造函数参数被传递到{{ 1}}。
这与Java相同:
ViewHolder
您还可以直接导入嵌套的静态类,然后删除class MyClass extends RecyclerView.ViewHolder {
public MyClass(ViewItem view) {
super(view);
}
}
前缀,但是保留它会更清楚。