2

我有一个扩展类ArrayList。为了在ListView小部件中显示其内容,我扩展了ArrayAdapter. 必须为我扩展的每个项目显示 2 个
属性。出于这个原因,我在我的扩展方法中扩展了一个自定义布局。ListViewArrayListgetView()ArrayAdapter

Android API 为 指定了 6 个构造函数ArrayAdapter,它们都有一个公共参数textViewResourceId,指定为“布局中TextView”或包含TextView布局” 。

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

4

3 回答 3

1

Android API 为 指定了 6 个构造函数ArrayAdapter,它们都有一个公共参数textViewResourceId,指定为“布局中的 TextView”或“包含TextView布局”。

这些被称为默认构造函数,旨在为那些寻找基于 One-Text-View 的 ListView 的人提供一个简单的实现。

由于您正在创建一个扩展 ArrayAdapter的自定义类,因此您不必使用相同的构造函数,您可以创建自己的构造函数。

例如:

public CustomArrayAdapter (Context context, 
        int TextViewRes, int OtherTextViewRes) {}

依此类推,只要覆盖所需的方法,就可以了。

于 2013-06-19T03:34:41.363 回答
1

你是对的,这有点令人困惑,但我认为如果你不覆盖,构造函数正在描述 ArrayAdapter 类的行为getView()。也就是说, 的默认行为getView()

从文档:

由任意对象数组支持的具体 BaseAdapter。默认情况下,此类期望提供的资源 id 引用单个 TextView。如果您想使用更复杂的布局,请使用也采用字段 id 的构造函数。该字段 id 应引用较大布局资源中的 TextView。

然而,TextView 被引用,它将被数组中每个对象的 toString() 填充。您可以添加自定义对象的列表或数组。覆盖对象的 toString() 方法以确定将为列表中的项目显示哪些文本。

因此,ArrayAdapter该类将接收一组对象,并且每个对象将只有一个要显示的字符串,该字符串是通过调用该对象的toString()方法生成的。这就是为什么所有构造函数都要求您传递参数以指向一个TextView,以显示该 ListItem 的单个字符串。如上所述,执行此操作的两种方法是: 1. 通过 id 指定单个 TextView 或 2. 传递更复杂布局的 id 以及该布局中所选 TextView 的 id 以显示字符串。

因此,如果您正在扩展 ArrayList,我认为所有的赌注都已关闭,您将覆盖默认行为,如果您愿意getView,您可以选择在 6 个不同的 TextView 中显示 6 个字符串,这取决于您。

于 2013-06-19T03:35:36.677 回答
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
    }

}
于 2013-06-19T03:43:25.297 回答