ArrayAdapter的构造函数中有多个TextView

时间:2013-06-19 02:37:19

标签: android android-listview android-arrayadapter

我有一个扩展ArrayList的课程。要在ListView窗口小部件中显示其内容,我会延长ArrayAdapter
ListView必须为我的扩展ArrayList的每个项目显示2个属性。出于这个原因,我在扩展getView()的{​​{1}}方法中为自定义布局充气。

Android API为ArrayAdapter指定了6个构造函数,并且它们都有一个共同的参数ArrayAdapter,它被指定为' a TextView in a layout''包含 a TextView'的布局。

为什么引用只有一个 textViewResourceId,如果在方法TextView中我们可以填充多个?如果要填充多个,那么应该将getView()传递给构造函数?

3 个答案:

答案 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
    }

}