【问题标题】:Practical Difference Between position and row id in onListItemClick()onListItemClick() 中位置和行 id 之间的实际区别
【发布时间】:2012-10-19 00:40:55
【问题描述】:

我对@9​​87654323@ 中的postionrow id 之间的区别感到困惑。

文档有以下内容:

position  The position of the view in the list
id        The row id of the item that was clicked

两者之间有什么实际区别吗?我假设,由于有两个不同的参数,存在值不同的情况,但根据文档中使用的措辞,很难看出这种差异可能是什么。是否其中一个可以保存Cursor 或其他一些特殊功能提供的数据库行ID 的值?

【问题讨论】:

  • 假设您对列表进行了排序。那么位置将与id非常不同。位置是从上到下,id 是唯一标识符。
  • 那么唯一标识符是如何分配的呢? ListView 中项目的顺序是第一次填充时的顺序,然后是排序等操作?

标签: android user-interface android-listview


【解决方案1】:

position:视图在列表中的位置
id:被点击项的行id

位置从 0 开始,从 ListView 的顶部到底部,而要获得正确的行 ID,重要的是传递给适配器的光标包含一个名为“_id”的列,表示每行的唯一 ID在表中。

如果您使用的是 ArrayAdapter,positionid 将变得相同。 id 将是 Adapter.getItemId(int) 的返回值,因此如果您使用 ArrayAdapter,它将与位置相同 - 快速搜索 ArrayAdapter 源代码显示它正在使用返回位置;计算出身份证。

【讨论】:

  • 如果表不包含_id 字段,那么可以说位置和行ID 相同吗?
  • 似乎如果您使用的是 arrayAdapter 它是相同的。 id 将是 Adapter.getItemId(int) 的返回值,因此如果您使用 ArrayAdapter,它将与位置相同 - 快速搜索 ArrayAdapter 源代码显示它正在使用返回位置;计算出 id :)
  • 这忽略了ListView 带有标题视图的情况。在这种情况下,位置 = id + 1。See my answer
【解决方案2】:

answer by Lazy Ninja 大部分是正确的,但是忽略了使用 ArrayAdapter 并通过调用 ListView.addHeaderView(View) 方法添加标题视图的情况。

如果您的列表有一个标题项,它将位于位置 0。

所以列表中的第一个“真实”项目将具有:

  • position = 1
  • id = 0

一般来说,position = id + number_of_header_views


如果您决定将标题视图添加到已经正常工作的代码列表中,这一点很重要。

如果您使用position 访问您的项目,那么您的代码需要按照以下几行进行更新:

  • 使用position - 1作为索引
  • 使用id作为索引
  • 使用ListView.getItemAtPosition(int) 而不是Adapter.getItem(int)

另请参阅此问题以进行相关讨论:

【讨论】:

  • 您发布的差异对于理解带有标题的列表视图非常关键。非常感谢您在这里的额外回答..
猜你喜欢
  • 2014-12-19
  • 2020-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 2023-03-08
相关资源
最近更新 更多