Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/184.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Android ArrayAdapter中使用对象数组?_Android_Listview_Android Arrayadapter - Fatal编程技术网

如何在Android ArrayAdapter中使用对象数组?

如何在Android ArrayAdapter中使用对象数组?,android,listview,android-arrayadapter,Android,Listview,Android Arrayadapter,我需要使用ArrayAdapter在Android应用程序中填充ListView。它说,为了, 例如,如果要在ListView中显示字符串数组,请使用构造函数初始化新的ArrayAdapter,以指定每个字符串和字符串数组的布局: ArrayAdapter=新的ArrayAdapter此, android.R.layout.simple_list_item_1,myStringArray 此构造函数的参数为: 你的应用程序上下文 包含数组中每个字符串的文本视图的布局 字符串数组 然后只需在Lis

我需要使用ArrayAdapter在Android应用程序中填充ListView。它说,为了,

例如,如果要在ListView中显示字符串数组,请使用构造函数初始化新的ArrayAdapter,以指定每个字符串和字符串数组的布局:

ArrayAdapter=新的ArrayAdapter此, android.R.layout.simple_list_item_1,myStringArray

此构造函数的参数为:

你的应用程序上下文 包含数组中每个字符串的文本视图的布局 字符串数组 然后只需在ListView上调用setAdapter:

<LinearLayout android:orientation="vertical">
    <ListView android:id="@+id/listOfHeaders" >
</LinearLayout>
ListView ListView=ListView findViewByIdR.id.ListView; listView.setAdapteradapter

但是,我没有字符串数组,我有一个包含字符串值的对象数组

public class Headers {
    private String from;
    private String to;
    private String subject;

    public Headers (String from, String to, String subject){
        this.from = from;
        this.to = to;
        this.subject = subject;
    }

    public String getFrom() { return from; }
    public void setFrom(String from) { this.from = from; }

    public String getTo() { return to; }
    public void setTo(String to) { this.to = to; }

    public String getSubject() { return subject; }
    public void setSubject(String subject) { this.subject = subject; }
}
我的布局确实包含与我的对象中的值相对应的TextView

以下是我的布局和我的ListView:

<LinearLayout android:orientation="vertical">
    <ListView android:id="@+id/listOfHeaders" >
</LinearLayout>
下面是要由ArrayAdapter填充的ListView中每一行的布局:

<LinearLayout android:orientation="horizontal">
    <TextView android:id="@+id/toTextView" />
    <TextView android:id="@+id/fromTextView" />
    <TextView android:id="@+id/subjectTextView" />
</LinearLayout>

对于您的信息类型,实际上可以通过重写getView方法来实现。基本上,您必须为ListView项提供自定义布局,并且必须在getView方法中进行充气。有关更多信息,请链接到此链接:

使用ArrayAdapter是不够的,您需要扩展ArrayAdapter并创建自定义适配器,以便覆盖行创建以使用列表布局。请检查此示例:

public class CustomAdapter extends ArrayAdapter<Headers> {

    Context context;
    int layoutResourceId;
    ArrayList<Headers> data = null;

    public CustomAdapter(Context context, int resource, List<Headers> objects) {
        super(context, resource, objects);
        this.layoutResourceId = resource;
        this.context = context;
        this.data = (ArrayList) objects;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View row = convertView;
        HeaderHolder holder = null;

        if(row == null)
        {
            LayoutInflater inflater = ((Activity)context).getLayoutInflater();
            row = inflater.inflate(layoutResourceId, parent, false);

            holder = new HeaderHolder();
            holder.from = (TextView) row.findViewById(R.id.fromTextView);
            holder.to = (TextView)row.findViewById(R.id.toTextView);
            holder.subject = (TextView)row.findViewById(R.id.subjectTextView);

            row.setTag(holder);
        }
        else
        {
            holder = (HeaderHolder) row.getTag();
        }

        Headers item = data.get(position);
        holder.from.setText(item.getFrom());
        holder.to.setText(item.getTo());
        holder.subject.setText(item.getSubject());

        return row;
    }

    private class HeaderHolder {
        public TextView from;
        public TextView to;
        public TextView subject;

    }
}
对于活动,在onCreate方法上:

ListView list = (ListView) findViewById(R.id.listView);
ArrayList<Headers> data = new ArrayList<Headers>();
data.add(new Headers("from", "to", "subject"));

ArrayAdapter adapter = new CustomAdapter(this, R.layout.list, data);
list.setAdapter(adapter); 

您可以看到,CustomAdapter正在使用HeaderHolder作为ViewHolder模式的一部分,因此列表管理是高效的。

因此,请使用ArrayAdapter,而不是ArrayAdapter是的,但是我需要用Headers对象中的字符串填充我的TextView,看起来ListView需要一个字符串数组,您可以重写getView方法并执行所有映射。如果使用ArrayAdapterContext、int resource、int textViewResourceId,则更容易实现这些复杂的映射。这就是我发布到StackOverflow的原因。只需覆盖getView,调用super并查看super返回的内容,那么3个简单的findViewById应该足够了,工作非常出色,谢谢!然而,有一个问题。有时在行标题item=data.getposition上会出现IndexOutOfBoundsException。不总是,但有时。我使用片段作为标签,当我从带有列表的片段中切换出来时,我得到了这一点。很高兴它有所帮助。对于例外情况,请在使用前添加一个if块以验证位置,或者将最后几行括在try..catch块中。这是一个奇怪的问题,但如果没有代码片段,我不确定是什么导致了它。在找到实际原因时,请使用以下两种建议之一避免出现异常。祝你的项目好运。我最后做了一些更改以消除错误。我将列表对象更改为objects[]objects,并使用Header thishheader=Header objects[position],这似乎已经修复了它。再次感谢你的帮助。