扩展自定义 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 示例。
在谈论参数化类型时,继承并不像您希望的那样工作:
- 即使
S
是T
的 proper 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 应该没问题。