【问题标题】:assigning hidden values to a listview item将隐藏值分配给列表视图项
【发布时间】:2010-08-16 11:01:59
【问题描述】:

我有一个扩展 ListView 的活动。我用对 sqlite 数据库的查询结果填充我的列表。列表元素由 start_time、end_time、client_name 和 status 组成。这些是我需要为每个列表项显示的 4 位信息。

我的问题是:我可以为这个 ListView 项分配隐藏元素吗?

例如,我想为该 ListView 项存储数据库行的 _id 字段,以便当我单击它时,我可以根据该数据库行的数据启动一个新活动。

编辑

我用来从光标填充列表的代码:

String[] columns = new String[] {VisitsAdapter.KEY_CLIENT_FULL_NAME, VisitsAdapter.KEY_STATUS,VisitsAdapter.KEY_CLIENT_START_TIME, VisitsAdapter.KEY_CLIENT_END_TIME};

// the XML defined views which the data will be bound to
int[] to = new int[] { R.id.name_entry,R.id.number_entry,R.id.start_time_display,R.id.end_time_display  };

SimpleCursorAdapter mAdapter = new SimpleCursorAdapter(HomeScreen.this, R.layout.list_element, cur, columns, to);

其中 R.layout.list_item 是我的列表项的 XML。我来自 PHP/HTML 背景,所以我通常在这里做的是有一个隐藏字段来保存我的 _id 值,一旦单击列表项,我就可以访问该值。我可以在android中做类似的事情吗?我可以在我的 xml 布局中放置一个隐藏的 _id 字段吗?

【问题讨论】:

    标签: android android-listview


    【解决方案1】:

    您应该尝试将自己从 Web 开发的思维框架中解脱出来。无需将 id 之类的东西存储在视图的隐藏字段中。这会将您的数据与您的用户界面混合在一起,并造成很多混乱和不必要的视图对象。

    如果您使用 sqlite 数据库来存储您的值,您应该使用CursorAdapter 来管理您的列表项。 CursorAdapter 存储您从数据库获得的结果并管理数据如何显示给用户。如果您随后在ListView 上注册onItemClickListener,则侦听器将接收适配器以及在适配器中单击其单元格的数据项的位置。现在您可以使用getItem 检索指向用于创建列表项的数据库结果的游标。现在,您可以从数据库结果中获取 id 或所有其他未向用户显示的值,并将其附加到启动下一个活动的意图。

    【讨论】:

    • 当你说我应该使用 CursorAdapter 时,你的意思是在我的示例代码中与 SimpleCursorAdapter 相对吗?
    • 感谢您的回复。在搜索列表项侦听器上的文档后,我发现 onListItemClick 会自动传递光标结果的 rowID。 (数据库中的 _id 列)。我认为这一切都错了(正如你所指出的),因为我认为我必须手动将它添加到列表项中,我没有意识到 android 会自动处理这个问题。谢谢,已接受答案。
    • +1 很好的解释......但是在 SimpleAdapter 的情况下我怎么能达到同样的效果?
    • “你应该试着让自己从 web 开发的思维框架中放松一点。” +1
    【解决方案2】:

    您应该考虑创建一个 java 对象来收集所有这些信息。例如,您可以创建一个像“ListItem”这样的类,每个项目都有 5 个属性:
    开始时间
    结束时间
    客户名称
    状态 ID (如果你需要,还有更多)

    然后,您有 2 个选项,您可以序列化对象以将整个对象放入数据库中,或者保留已有的结构(我想),并且数据库的每一行都变为 ListItem 对象.然后,当您查询数据库时,将它们全部放在一个 ArrayList 中,并扩展 ArrayAdapter 以制作您自己的适配器。最后,在getView方法中,调用myListItem.getEnd_Time和显示数据所需的所有方法,干脆不要使用getId,在需要对象的时候可以直接从适配器中使用。

    【讨论】:

    • 对不起 sephy,我对 android 很陌生,我并没有真正按照你的回答,我发布了相关代码来显示我来自哪里
    • 当人们花时间向你解释事情而你只是投反对票时,这种处理答案的方式是什么。我不敢相信。
    • 嗨,Sephy,我应该指出,不是我降级了你的答案。感谢您的回复以及您花时间查看我的问题。我不能说是谁降级的,因为我不知道。 Kuroutadori 的回答也是如此。
    • 好的,那么请接受我的道歉。通过降低人们的答案,这是一种奇怪的方式......
    【解决方案3】:

    如果您需要 _id 以外的非显示 db cols,请在 ListView 的 onItemClick(...) 你只需打电话:

    mAdapter.getCursor();
    

    然后您可以获得所选列表项/行的任何非显示列。

    正如 Janusz 所说,如果您只需要 _id,只需调用:

    mAdapter.getItemId();
    

    【讨论】:

      猜你喜欢
      • 2019-12-31
      • 2015-12-24
      • 2013-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-14
      • 2018-06-10
      • 2013-07-17
      相关资源
      最近更新 更多