我有一个扩展ArrayList
的课程。要在ListView
窗口小部件中显示其内容,我会延长ArrayAdapter
。
ListView
必须为我的扩展ArrayList
的每个项目显示2个属性。出于这个原因,我在扩展getView()
的{{1}}方法中为自定义布局充气。
Android API为ArrayAdapter
指定了6个构造函数,并且它们都有一个共同的参数ArrayAdapter
,它被指定为' a TextView in a layout'或'包含 a TextView'的布局。
为什么引用只有一个 textViewResourceId
,如果在方法TextView
中我们可以填充多个?如果要填充多个,那么应该将getView()
传递给构造函数?
答案 0 :(得分:1)
Android API为
ArrayAdapter
指定了6个构造函数,并且它们都有一个共同的参数textViewResourceId
,在布局中指定为“ a TextView”,或包含TextView的' a 布局。
这些被称为默认构造函数,旨在为那些寻找基于单文本视图的ListView的人提供简单的实现。
由于您要创建扩展 ArrayAdapter
的自定义类,因此您不必使用相同的构造函数,也可以创建自己的构造函数。
例如:
public CustomArrayAdapter (Context context,
int TextViewRes, int OtherTextViewRes) {}
依此类推,只要你覆盖所需的方法,你就可以了。
答案 1 :(得分:1)
你是对的,这有点令人困惑,但我认为正在进行的是构造函数正在描述ArrayAdapter类的行为,如果你不重写getView()
。也就是getView()
的默认行为。
来自文档:
由任意对象数组支持的具体BaseAdapter。默认情况下,此类期望提供的资源ID引用单个TextView。如果要使用更复杂的布局,请使用也带有字段ID的构造函数。该字段id应引用较大布局资源中的TextView。
但是引用了TextView,它将填充数组中每个对象的toString()。您可以添加自定义对象的列表或数组。覆盖对象的toString()方法,以确定将为列表中的项显示哪些文本。
因此,ArrayAdapter
类将接受一个对象数组,每个对象只有一个要显示的String,通过调用该对象的toString()
方法生成。这就是为什么所有构造函数都要求您传递参数以指向一个 TextView,以显示该ListItem的单个String。如上所述,这样做的两种方法是:1。通过id或2指定单个TextView。传递更复杂布局的id以及该布局中所选TextView的id以显示String。
因此,如果您扩展 ArrayList
,我认为所有赌注都已关闭,您将覆盖getView
的默认行为,您可以如果你愿意,可以选择在6种不同的TextView中显示6个字符串,这取决于你。
答案 2 :(得分:0)
我发现ArrayAdapter除了非常基本的用例之外不是非常可扩展的。您已经注意到构造函数的示例就是一个例子。
建议您实际扩展BaseAdapter
并实现以下内容:
public class MyArrayAdapter<T> extends BaseAdapter {
private Context mContext;
private List<T> mItems = new ArrayList<T>();
public MyArrayAdapter(Context context, ArrayList<T> items) {
mContext = context;
mItems = items;
}
public int getCount() {
return mItems .size();
}
public Object getItem(int position) {
return mItems .get(position);
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
// your existing code
}
}