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

Posted

技术标签:

【中文标题】如何在 Android ArrayAdapter 中使用对象数组?【英文标题】:How do I use an array of objects with the Android ArrayAdapter? 【发布时间】:2016-08-03 10:23:01 【问题描述】:

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

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

ArrayAdapter 适配器 = 新的 ArrayAdapter(this, android.R.layout.simple_list_item_1, myStringArray);

这个构造函数的参数是:

您的应用上下文 包含数组中每个字符串的 TextView 的布局 字符串数组

然后只需在 ListView 上调用 setAdapter():

ListView listView = (ListView) findViewById(R.id.listview); listView.setAdapter(适配器);

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

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>

这里是ListView中每一行由ArrayAdapter填充的布局:

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

【问题讨论】:

所以使用ArrayAdapter&lt;Headers&gt;,而不是ArrayAdapter&lt;String&gt; 是的,但是我需要用 Headers 对象中的字符串填充我的 TextView,看起来 ListView 想要一个字符串数组。 不是真的,你可以重写getView 方法并做所有的映射(如果你使用ArrayAdapter(Context context, int resource, int textViewResourceId) ctor 会更容易) 我不知道如何实现它的复杂性。这就是我发布到 *** 的原因。 只需覆盖getView,调用super,看看super返回什么,那么3个简单的findViewById就足够了 【参考方案1】:

使用 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;

    

对于Activity,在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 模式的一部分,因此列表管理非常高效。

【讨论】:

效果很好,谢谢!然而,有一个问题。我有时会在“Headers item = data.get(position)”行上得到一个 IndexOutOfBoundsException。不总是,但有时。我使用 Fragments 作为选项卡,当我用我的列表从 Fragment 切换时得到这个。 很高兴它有帮助。对于例外情况,在使用之前添加一个 if 块来验证位置,或者将最后几行包含在 try..catch 块中。这是一个奇怪的问题,但如果没有片段代码,我不确定是什么原因造成的。在找到实际原因时,使用这两个建议之一来避免异常。祝你的项目好运。 我最终做了一些更改以消除错误。我将 List 对象更改为 Objects[] 对象并使用 Header thisHeader = (Header) objects[position],这似乎已经修复了它。再次感谢您的帮助。【参考方案2】:

对于您的信息,您实际上可以通过覆盖 getView() 方法来做到这一点。基本上,您必须为您的 ListView 项目提供自定义布局,并且您必须在 getView() 方法中进行膨胀。欲了解更多信息,您可以链接到这个:http://www.ezzylearning.com/tutorial/customizing-android-listview-items-with-custom-arrayadapter

【讨论】:

以上是关于如何在 Android ArrayAdapter 中使用对象数组?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Android 中 ArrayAdapter 上的 ArrayList 更新项目

如何在 listView Xamarin Android 中使用具有多个 Textview 列的 ArrayAdapter

使用android中的自定义arrayadapter在listview中使用复选框检查后如何删除多个项目?

Android:如何从 listView 和 arrayAdapter 中删除项目

在Android中通过ArrayAdapter在ListView中单击单个ImageView背景后如何更改它?

在android中使用arrayadapter类自定义listview