onListItemClick()中位置和行id之间的实际差异

Pau*_*den 27 user-interface android android-listview

我感到困惑之间的差异postionrow idListActivity.onListItemClick().

该文档包含以下内容:

position  The position of the view in the list
id        The row id of the item that was clicked
Run Code Online (Sandbox Code Playgroud)

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

Laz*_*nja 34

position:列表中视图的位置
id:单击的项目的行ID

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

如果您正在使用ArrayAdapter,position并且id变得相同.id将是返回值,Adapter.getItemId(int)所以如果你使用ArrayAdapter它将与位置相同 - 快速搜索ArrayAdapter源代码显示它使用返回位置; 计算出身份.

  • 似乎如果你使用的是arrayAdapter,它就是一样的.id将是Adapter.getItemId(int)的返回值,因此如果使用ArrayAdapter它将与位置相同 - 快速搜索ArrayAdapter源代码显示它使用返回位置; 找出id :) (5认同)
  • 这忽略了具有标题视图的`ListView`的情况.在那种情况下position = id + 1. [见我的回答](http://stackoverflow.com/a/24531354/383414) (3认同)

Ric*_*ier 27

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)

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

  • 你发布的差异对于理解带有标题的listview来说是非常关键的一点..非常感谢你在这里的额外答案.. (2认同)