Java 扩展自定义阵列适配器

Java 扩展自定义阵列适配器,java,android,android-arrayadapter,Java,Android,Android Arrayadapter,我有一个自定义的ArrayAdapter,用于在列表中放置图标 public class IconArrayAdapter extends ArrayAdapter<IconListItem> { protected int resource; public IconArrayAdapter(Context context, int resource, ArrayList<IconListItem> items) { super(con

我有一个自定义的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;
    }
}
没问题

编辑2:为移除了私有位的IconrayAdapter添加了代码。

TeamListArrayAdapter的超类是IconrayAdapter。您正在尝试将ArrayList项作为参数传递到超级。。。构造函数调用,但IconArrayAdapter没有任何将ArrayList项作为参数的构造函数

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


如果TeamListItem继承了IconListItem,您就可以完成您的方法。与您的对象类示例类似。

继承的工作方式与您在讨论参数化类型时希望的不同:

即使S是T的一部分 那么List不是List的子类型 因此,如果参数的类型为List,则不能将列表作为参数传递

但是,在您的案例中,您可以通过以下方式解决此问题:

public TeamListArrayAdapter(Context context, ArrayList<TeamListItem> items) {
  super(context, R.layout.team_list_item, new ArrayList<IconListItem>(items));
}
这只是将列表中的所有项复制到一个新列表中,然后将后者作为参数传递给超类型构造函数

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

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构造函数就可以了。

IconArrayAdapter扩展了ArrayAdapter,这样您只能将列表传递到其构造函数中,而不能传递列表。这很有意义。所以在这种情况下,它会破坏物品的扩展属性吗?或者如果我稍后将每个物品转换为TeamListItem,它们仍然可用吗?@DevinRodriguez。这些项仍然是TeamListItem类型,因此它们的所有状态都被保留,但它们现在保存在一个将它们视为IconListItem的类型中。这实际上可能会导致您出现其他问题,例如稍后以TeamListItems的形式返回项目的风险降级,因此您可能应该重新考虑您试图实现的目标以及如何设计它。我已将更多代码发布到iConaryAdapter以供审阅。我试图实现的是,在团队成员列表中,需要显示额外的信息。团队列表项与图标列表项几乎完全相同,还有一块需要填写的文本,因此我希望扩展现有类并在getView中进行必要的更新,而不是克隆整个类来实现此目的。@devirodriguez。更新的答案,试试看。试一试,另一个错误阻止我现在进入应用程序的该部分。是ArrayAdapterContext上下文,int资源,列出对象,所以这不起作用。现在将出现一个编译器错误,即找不到接受捕获类型的构造函数。@AndyBrown不完全正确。ArrayAdapter还有一个构造函数,它只接受一个上下文和一个int。仅供参考。@MikeM。是的,但我忽略了这一点,因为我假设Vino确实打算在对super的调用中使用items参数,尽管在调用中省略了参数。
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);
}