自定义数组适配器

时间:2017-11-14 11:29:43

标签: android listview android-arrayadapter

enter image description here

我正在尝试制作自定义列表视图。该列表声明如下

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);

任何人都可以解释这是什么问题吗?错误屏幕截图的链接在上面。我尝试搜索此特定问题,但未能找到有效的解决方案。

2 个答案:

答案 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<>