[英]Who calls getView() in ArrayAdapter?
我正在为ListView编写自己的适配器,但是在某些概念上遇到了麻烦。 首先,这就是我写的:
public class MyArrayAdapter extends ArrayAdapter<String> {
private final Context context;
private final int parent;
private final String[] values;
public MyArrayAdapter(Context context, int resourceid, String[] values) {
super(context, -1, values);
this.context = context;
this.parent = resourceid;
this.values = values;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View rowView = inflater.inflate(R.layout.rowlayout, parent, false);
TextView textView = (TextView) rowView.findViewById(R.id.label);
ImageView imageView = (ImageView) rowView.findViewById(R.id.icon);
textView.setText("abcde lorem ipsum");
String s = values[position];
imageView.setImageResource(R.drawable.no);
return rowView;
}
}
大家可以看到,我在构造函数中添加了resourceid作为参数,因为此页面告诉我必须使用3个参数。 然而,在3.3例子这篇文章 ,当它写一个定制的适配器,它使用2个参数的构造函数。 但是,如果我没有在构造函数中传递R.layout.rowlayout
作为参数,getView如何知道谁是ViewGroup parent
? 我的意思是,必须以某种方式调用getView,并且必须将父对象传递给它。 但是班级怎么知道谁是父母?
另外,android页面指示我这样称呼它:
MyArrayAdapter<String> adapter = new MyArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, myStringArray);
但是我最终不得不取消<String>
并像这样离开它:
MyArrayAdapter adapter = new MyArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, myStringArray);
为什么?
是否因为本文没有使用<String>
扩展了类? 像这样:
public class MyArrayAdapter extends ArrayAdapter<String> {
另外,由于我要重写该类,所以为什么需要使用super
调用原始构造函数?
我认为您误解了一些基本概念。 首先, ArrayAdapter
需要3个构造函数参数,从其继承的类可以具有任意多个。 另外,您将列表项的资源ID传递给它,而不是父项的资源ID。
ArrayAdapter
的基本思想是这样的:
public class MyArrayAdapter extends ArrayAdapter<String> {
public MyArrayAdapter(Context context, String[] values) {
super(context, R.layout.rowlayout, values);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View rowView = super.getView(position, convertView, parent);
...
return rowView;
}
}
ArrayAdapter.getView()
将返回传递给构造函数的布局实例。
其次:适配器连接到ListView
。 ListView
知道包含列表的视图的布局,因此知道每一行的父视图。 ListView
也是在适配器上调用getView()
的列表。 只需在getView中添加一个断点,就可以看到谁在调用它。
进行中,,
即使创建了MyArrayAdapter
对象,它也不会执行此类中的任何方法,除非您在ListView
引用上MyArrayAdapter
对象设置为适配器。 因此,此ViewGroup parent
来自ListView引用,以根据父级参数相应地为元素充气(父级将是listview)。
如果要为ListView中的每个元素使用完全不同的自定义布局,则不要将资源ID传递给适配器。
public MyArrayAdapter(Context context, String[] values) {
super(context, 0, values);
this.context = context;
this.values = values;
}
因为现在您正在为元素使用自定义布局,并且您需要使用以下内容进行充气,
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View rowView = inflater.inflate(R.layout.rowlayout, parent, false);
现在是棘手的部分。
如果您实际上要从构造函数传递resourceid,
如下,
public MyArrayAdapter(Context context, int resourceid, String[] values) {
super(context, 0, values);// 0 is just a filler here,
this.context = context;
this.resourceid= resourceid;
this.values = values;
}
您的Custom类对我来说更通用(与android无关)
因为,
你可以在这里使用
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View rowView = inflater.inflate(this.resourceid, parent, false);
您还应该阅读此答案,以掌握ArrayAdapter
的思想。
编辑:
我没有看到即将到来,请不要错过以下内容
this.parent = resourceid;
与,
public View getView(int position, View convertView, ViewGroup parent) {
父母
有做衍生ViewGroup parent
从超resourceid
(basiclly没有关系)的超级构造函数,这ViewGroup parent
快到形式ListView
时ListView
基准设置与适配器。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.