我正在实现自定义recyclerviews以响应具有某些参数的类的实例。为此,我实现了VieHolders。我创建了一个抽象的ViewHolder,这样我就可以同时传递两种布局。但是,当我从超类继承并尝试在抽象类上实现构造函数时,它没有采用具体类会采用的参数,并且我收到一条错误消息,指出父类没有可用的默认构造函数。
我期望的工作:
private abstract class CrimeHolder extends RecyclerView.ViewHolder{
public CrimeHolder(View view, ViewGroup parent, Boolean false){
super(view, parent, false);
}
然后从该类扩展的类将做到这一点:
private class RegularCrimeHolder extends CrimeHolder{
public RegularCrimeHolder(Inflater inflater, ViewGroup parent{
super(inflater.inflate(R.layout.list_item_crime, parent, false));
}
}
但是实际上发生的是CrimeHolder不能将具体的类作为相同的参数传递给超构造函数,否则我将得到“找不到默认构造函数”,因此CrimeHolder的编写方式如下:
abstract class CrimeHolder extends RecyclerView.ViewHolder {
private CrimeHolder(View view){
super(view);
}
}
尽管我必须为CrimeHolder编写的构造函数只接受一个View参数,但我仍然必须将完整的参数传递给RegularCrimeHolder中的超构造函数。为什么子类调用具有这么多参数的超级构造函数?
答案 0 :(得分:0)
我期望的工作
RecyclerView.ViewHolder
takes a single View
parameter的构造函数。您正在尝试传递三个参数。那不会编译。
然后从该类扩展的类就可以做到这一点
您的CrimeViewHolder
构造函数采用三个参数。您的RegularCrimeHolder
子类正在尝试传递单个参数。那不会编译。
尽管我必须为CrimeHolder编写的构造函数只接受一个View参数
否,super
调用采用一个参数。您声明的构造函数带有三个参数。
为什么子类调用带有许多参数的超级构造函数?
大概是您键入的。好像您尝试模仿inflate()
上的LayoutInflater
调用的参数列表。
将您的CrimeHolder
改写为:
private abstract class CrimeHolder extends RecyclerView.ViewHolder{
public CrimeHolder(View view){
super(view);
}
将您的RegularCrimeHolder
改写为:
private class RegularCrimeHolder extends CrimeHolder{
public RegularCrimeHolder(LayoutInflater inflater, ViewGroup parent) {
super(inflater.inflate(R.layout.list_item_crime, parent, false));
}
}