如何在 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<Headers>
,而不是ArrayAdapter<String>
是的,但是我需要用 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对于您的信息,您实际上可以通过覆盖 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 中删除项目