【问题标题】:ArrayAdapter<MyClass> attaching to a ViewArrayAdapter<MyClass> 附加到视图
【发布时间】:2012-05-22 03:30:09
【问题描述】:

早安,

我似乎遗漏了一条将 ArrayAdapter 连接到视图的信息(仍在学习我的第一个 Android 应用程序)。我创建了一个名为 MyInfoClass 的类,它只是一些用于保存数据的属性。我用数据行填充类,最后我有一个 ArrayList(MyInfoClass>. 到目前为止一切顺利,一切看起来都很棒,并且值与我在 Debug 透视图中所期望的一样。

我还有一个 XML 布局,上面有一些 TextView。我想使用此布局来显示 ArrayList(MyInfoClass> 中保存的不同“数据集”。我知道要做到这一点,我会使用 ArrayAdapter,我会使用以下行:

ArrayAdapter<MyInfoClass> X = new ArrayAdapter<MyInfoClass>(this, R.layout.main, R.id.txtvw_PrevLift, ld_data);

(ld_data 是 ArrayList(MyInfoClass> 对象)

我的困惑来自......嗯,不知道我在做什么,但无论如何,它来自不了解如何将 MyInfoClass 的属性连接到它们相应的 TextView。 ArrayAdapter 文档没有显示采用 TextView id 列表的构造函数????

感谢您的帮助。 JB

为了帮助消除我的困惑,我没有绑定到列表....也许我应该?我只是想让整个视图代表一行数据。我已经修剪了很多代码以提高可读性,但这是我的观点。一些文本视图是静态标签,而另一些会被填充。这些按钮用于来回导航。

<RelativeLayout....>

    <ImageView
        android:id=.../>

    <TextView
        android:id=.../>

    <ImageView
        android:id=.../>


    <TextView
        android:id=.../>

    <TextView
        android:id=.../>

    <TextView
        android:id=.../>

    <Button
        android:id=.../>

    <Button
        android:id=.../>

</RelativeLayout>

【问题讨论】:

标签: java android


【解决方案1】:

在你的情况下最好使用SimpleAdapter

您定义了一个代表您的列表项的 XML 文件。此 XML 文件将包含 TextViews,您将在其中显示来自 MyInfoClass 的数据。说是my_list_item.xml

<LinearLayout...>
<TextView android:id=name.../>
<TextView android:id=gender.../>
<TextView android:id=occupation.../>
</LinearLayout>

假设你有他们的数据MyInfoClass.getName(), .getGender(), .getOccupation()

您创建一个地图列表,每个地图代表一个列表项的数据:

List<HashMap<String, String>> maps = new ArrayList<HashMap<String, String>>();

您在此列表中填写您的信息:

for(int i=0; i<myArray.size(); ++i) {
        HashMap<String, String> map = new HashMap<String, String>();
        map.put("name", myArray.get(i).getName()); 
        map.put("gender", myArray.get(i).getGender()); 
        map.put("occupation", myArray.get(i).getOcupation()); 
        maps.add(map); // add this entry to the list
    );

您还创建了 2 个数组:一个具有键名称(“name”、“occupation”、“gender”),另一个具有相应资源的 id。它们是String[] from, int[] to,因此地图中带有from[n] 键的数据会显示在ID 为to[n] 的视图中

String[] from = new String[] {"name", "gender", "occupation" };
int[] to = {R.id.name, R.id.gender, R.id.occupation }

然后您使用该列表和您的 XML 文件创建一个 SimpleAdapter

SimpleAdapter mAdapter = new SimpleAdapter(YourActivity.this, maps, R.layout.my_list_item, from, to);

然后您在ListActivity 中设置此适配器,然后将显示列表:

setListAdapter(mAdapter);

如果您想显示字符串以外的内容,则需要继承 SimpleAdapter 并重新定义一些函数,例如 setViewTextsetViewImage,但我对此了解不多

【讨论】:

  • 具有讽刺意味的是,我遵循了关于创建哈希映射并传递它的更复杂的部分。我偶然发现的地方是“属性方法”我必须创建一个 get/set 访问器方法吗?我在我的班级: public String AcctName;在 c# 中,编译器会将速记转换为具有读/写功能的完全可访问的属性?
  • 好的,所以我声明了我的 Data 类,并且我确实有访问器方法,所以我的问题是将 ArrayList 导航到集合中的特定项目。
  • 不,您不一定需要 getter/setter。你可以做 map.add("account", myObject.acctName) 或者你可以做 map.add("account", "my bank account")
  • 有趣。所以我将 MODE_WORLD_READABLE 与 get 一起使用,然后显示我的个人属性。我需要阅读更多内容。
  • 您拥有对象的 ArrayList,您可以遍历数组列表并将每个对象的字段添加到地图中。每个对象一个映射,该映射中的条目与您要显示的对象字段一样多。
【解决方案2】:

我认为您正在寻找一个简单的列表适配器。

http://developer.android.com/reference/android/widget/SimpleAdapter.html

它允许您指定从哪些字段获取数据(构造函数中的from[])以及放置数据的位置(构造函数中的to[])

我不知道简单列表适配器是否适用于数据对象,但我知道它适用于哈希图。在处理数据对象列表时,我使用扩展 BaseAdapter 类型的自定义适配器。

请参阅本教程,了解如何在列表视图中使用简单的适配器:http://eureka.ykyuen.info/2010/01/03/android-simple-listview-using-simpleadapter/

编辑:如果您更喜欢使用数据对象,这里是另一个 QA,它展示了使用数据对象轻松实现自定义 SimpleAdapter How to use ArrayAdapter<myClass>

编辑#2::抱歉,我以为你绑定到一个列表。其他人最近遇到了这个问题,我建议使用列表视图的基本基础结构,但对其进行修改,以便只有一个项目跨越列表视图的整个大小。 item 本质上是包含所有文本视图的布局。在该示例中,您需要跟踪要显示的项目(从哪个数据对象获取信息)并使用它。您可以在这里查看我建议的解决方案:Android - wizard type activity with adapter backed data

【讨论】:

  • 但是如果我实际上没有列表,它是一个简单的列表适配器吗?我的 xml 视图是关于 XYZ 信息的“页面”,带有上一个和下一个按钮。当这个人点击下一个时,我希望他们看到下一个“页面”信息。布局完全相同,只是信息/数字在数据集中来回移动时会发生变化。所以在某种程度上我没有要绑定的列表,但我确实有一个页面“列表”。本质上,我的整个“页面”代表一行......?
  • 对不起,我以为你只是绑定到一个列表视图。我已经用一个我很确定会起作用的解决方案编辑了我的答案,但是,它可能会将列表视图的概念扩展到其极限:)
  • 您的编辑很有意义,但我遇到了编译错误。 Eclipse 不喜欢 ListView“内部”的任何东西。 。只处理按钮点击并重新填充文本视图然后重绘对我来说会更好吗?
  • 阅读有关如何将列表视图与适配器一起使用的教程。没有 这样的东西。包含所有文本视图的布局将成为列表视图中项目的布局(我们将其称为 lv_item.xml)。当您创建列表视图适配器时,您需要指定 each 行/项目将使用什么布局来显示该行的信息;您将在此处输入 lv_item.xml。如果您使用的是自定义适配器,您需要做的就是在 GetView 方法中扩展布局 (lv_item.xml) 并使用正确的数据填充它。
  • 哦,是的,我现在明白了。你可能会对我在学习为 Android 开发时想到/尝试过的所有愚蠢的事情感到好笑。
猜你喜欢
  • 2011-01-16
  • 2014-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-15
  • 2015-07-12
  • 1970-01-01
相关资源
最近更新 更多