【问题标题】:onListItemClick does not work with non-integer idonListItemClick 不适用于非整数 id
【发布时间】:2011-07-05 11:55:43
【问题描述】:

我正在使用listview,其中主键是text,而不是integer。它实际上是一个唯一的网址

到目前为止它工作正常,我什至设法将rawQuery() 中的url column 别名为_idlistview 很高兴地接受了它。

但现在我遇到了问题!

onListItemClick() 将 id 作为 long 返回,所以当我点击一个项目时,无论如何我都会得到 0

是否可以通过其他方式获取点击的id?

【问题讨论】:

  • 将 _id 列添加到您的 db 表中,然后 CursorAdapter 就可以正常工作了。这似乎是最简单的。
  • @Hermann:CursorAdapter 似乎工作得很好。一切都按预期显示在列表视图中。没有错误。但从 OnListItemClick 返回的 id 始终为零,因为它期望 id 为整数。如果 _id 是文本,我不明白为什么添加 _id 列会解决这个问题。此外,url 列别名为 _id,所以从适配器的角度来看,有一个 _id 列!
  • CursorAdapter(和 ContentProvider)需要一个整数类型的 _id 列。因此,如果您希望适配器正确运行,请添加整数类型的列 _id。带有url的列仍然可以是主键,仍然可以命名为id。
  • 这肯定行得通,但是我又回到了我有一个整数 _id 的开始 :-) 我是 Android 新手,正在探索可能性,我认为使用 url 作为 _id会更合乎逻辑。
  • 对抗框架并不是最好的办法。您应该接受必须有一个名为 _id 且类型为整数的列。您仍然可以拥有其他类型为字符串的唯一列。

标签: android listview


【解决方案1】:

应该可以将字段 _id 添加到您的数据库中。否则,这可能对您有用:

protected void onListItemClick(ListView l, View v, int position, long id) {
    Cursor c = (Cursor) getListAdapter().getItem(position);
    String url = c.getString(c.getColumnIndex("_id"));
}

如果您在适配器上使用this question 中的过滤,则此解决方案将不起作用。 onListItemClick 会报告过滤后的位置

【讨论】:

  • 我认为这行得通。除了它应该是 c.getColumnIndex("_id") 因为 url 列在查询中被别名为 _id 。然而,什么是过滤?我想我仍然可以使用 WHERE 子句过滤我的原始查询,对吧?
  • 是的,如果你用 sql 过滤一切都很好。我的意思是像this question 一样过滤 ListView。
  • 啊,好的。我尝试了您的解决方案,并且效果很好。太感谢了。但是还有一个问题:我在这里使用非整数 _id 列做的事情是不好的做法吗?我真的应该回到整数_id吗?
  • 如果没有整数类型的 _id 列,您将一遍又一遍地遇到问题。
猜你喜欢
  • 2011-03-27
  • 2020-04-30
  • 1970-01-01
  • 1970-01-01
  • 2017-10-15
  • 2017-04-23
  • 2012-09-18
  • 1970-01-01
  • 2014-04-14
相关资源
最近更新 更多