我正在尝试制作自定义列表视图。该列表声明如下
List<DocRow> doctors = new ArrayList<>();
然后填充此列表。
我的自定义数组适配器位于一个单独的类中,其构造函数声明如下。
public class DocAdapter extends ArrayAdapter<DocRow>{
Context context;
int resource;
ArrayList<DocRow> doctors;
private LayoutInflater inflater;
public DocAdapter(@NonNull Context context, @LayoutRes int resource, ArrayList<DocRow> doctors) {
super(context, resource, doctors);
this.context = context;
this.resource = resource;
this.doctors = doctors;
inflater = LayoutInflater.from(context);
}
现在在我的主要活动中,我试图通过传递我的列表(这是一个有效的参数)来创建一个新的自定义数组适配器,它不被接受。用于创建和设置用于链接列表视图和列表的适配器的代码如下所示。
DocAdapter adapter = new DocAdapter(getApplicationContext(), R.layout.doc_row, doctors);
docList.setAdapter(adapter);
任何人都可以解释这是什么问题吗?错误屏幕截图的链接在上面。我尝试搜索此特定问题,但未能找到有效的解决方案。
答案 0 :(得分:2)
在您传递列表时,将构造函数参数更改为List
而不是ArrayList
。
List<DocRow> doctors;
public DocAdapter(@NonNull Context context, @LayoutRes int resource, List<DocRow> doctors) {
super(context, resource, doctors);
this.context = context;
this.resource = resource;
this.doctors = doctors;
inflater = LayoutInflater.from(context);
}
正如@Tim所指出的,这里有一个关于为什么需要它的细节。
初始化实例时,可以使用其子类之一初始化它,但该对象仍然只是Super类的实例(由于运行时多态性),因此使用此实例的方法要么是超类,要么是实例应该在传递之前将其转换为超类。
最简单的识别方法是始终查看左侧的类型。
List a=new ArrayList();
在上面的示例中,实例实际上是一个arraylist,但它是Type List。
答案 1 :(得分:0)
父类的引用可以存储子类的对象,但反之则不然。
此处,在适配器的构造函数中,您有ArrayList<DocRow>
作为参数类型,但doctors
列表的类型为List<DocRow>
。您,您正在将List<>
对象传递给ArrayList<>
引用。
要解决此问题,请将您的医生变量类型更改为ArrayList<>
,或将构造函数参数类型更改为List<>