Ваш вопрос: почему следующий код вызывает открытый метод 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, когда вы выходите из класса, ваш конструктор должен вызвать супер-конструктор и короткийдля этого нужно сделать это в объявлении.
class MyClass(ViewItem view) : RecyclerView.ViewHolder(view) {
// ...class body
}
Это говорит о том, что MyClass
происходит от ViewHolder
, который является вложенным классом RecyclerView
, а параметр конструктора, входящий в конструктор MyClass
, равенпередается в супер-конструктор ViewHolder
.
Это то же самое, что и Java:
class MyClass extends RecyclerView.ViewHolder {
public MyClass(ViewItem view) {
super(view);
}
}
Вы также можете напрямую импортировать вложенный статический класс, а затем удалить префикс RecyclerView
, но немного яснее оставить это.