扩展自定义 ArrayAdapter

Extend a custom ArrayAdapter

我有一个自定义 ArrayAdapter 用于在列表中放置图标

public class IconArrayAdapter extends ArrayAdapter<IconListItem> {

    protected int resource;

    public IconArrayAdapter(Context context, int resource, ArrayList<IconListItem> items) {
        super(context, resource, items);
        this.resource = resource;
    }

    public IconArrayAdapter(Context context, ArrayList<IconListItem> items) {
        super(context, R.layout.icon_list_item, items);
        this.resource =  R.layout.icon_list_item;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        IconListItem iconItem = getItem(position);
        if (convertView == null) {
            convertView = LayoutInflater.from(getContext()).inflate(this.resource, null);
        }

        ...

        return convertView;
    }
}

这是我在我的应用程序的多个部分使用的通用适配器,我需要在一个地方扩展一点以实现更具体的目的。我开始构建扩展 class 但立即 运行 变成了一个问题

public class TeamListArrayAdapter extends IconArrayAdapter {

    public TeamListArrayAdapter(Context context, ArrayList<TeamListItem> items) {
        super(context, R.layout.team_list_item, items);
    }

}

尽管 TeamListItem 扩展了 IconListItem,但我无法将项目传递到 super。根据我的理解,因为 TeamListItem extends IconListItem 我应该能够通过它,但显然我不能。我在这里误解了什么?

编辑: 我想我有点困惑,因为我可以轻松地做以下事情:

private class Object1 {
    protected int property1 = 1;
}

private class Object2 extends Object1 {
    protected int property2 = 2;
}

ArrayList<Object1> objects = new ArrayList<Object1>();
objects.add(new Object2());

没问题。

编辑 2: 为已删除私有位的 IconArrayAdapter 添加了代码。

TeamListArrayAdapter的超class是IconArrayAdapter。您试图在 super(...) 构造函数调用中将 ArrayList<TeamListItem> items 作为参数传递,但是 IconArrayAdapter 没有任何将 ArrayList<TeamListItem> items 作为参数的构造函数。

请给我们您的 IconArrayAdapter 的完整代码,并告诉我们您的初始目标。你为什么要扩展这个 class 等等?

如果 TeamListItem 继承了 IconListItem,您就可以完成您的方法。类似于您的 Object-class 示例。

在谈论参数化类型时,继承并不像您希望的那样工作:

  • 即使 STproper subtype
  • 那么 List<S> 不是 List<T>
  • 的子类型

因此您不能将 List<TeamListItem> 作为参数传递给 List<IconListItem>.

类型的参数

但是,您可以通过以下方式解决此问题:

public TeamListArrayAdapter(Context context, ArrayList<TeamListItem> items) {
  super(context, R.layout.team_list_item, new ArrayList<IconListItem>(items));
}

这只是将 List<TeamListItem> 中的所有项目复制到新的 List<IconListItem> 中,然后将后者作为参数传递给超类型构造函数。

编辑: 根据您的问题编辑,我认为您可以这样做:

public class IconArrayAdapter<T extends IconListItem> extends ArrayAdapter<T> {
  protected int resource;
  public IconArrayAdapter(Context context, int resource, ArrayList<T> items) {
      super(context, resource, items);
      this.resource = resource;
  }
}

public class TeamListArrayAdapter extends IconArrayAdapter<TeamListItem> {
  public TeamListArrayAdapter(Context context, ArrayList<TeamListItem> items) {
      super(context, R.layout.team_list_item, items);
  }
}

也许你需要

public IconArrayAdapter(Context context, ArrayList<? extends IconListItem> items) 
{
    super(context, R.layout.team_list_item);
}

然后你的 TeamListArrayAdapter ctor 应该没问题。