2012-10-19 42 views
22

我对postionrow id之间ListActivity.onListItemClick()之间的区别感到困惑。onListItemClick()的位置和行ID之间的实际区别

的文档有以下几点:

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

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

+2

说你排序列表。那么这个职位将会与ID非常不同。位置是从上到下,id是唯一标识符。 –

+0

如何分配唯一标识符? ListView中的项目顺序是在第一次填充之前进行排序等任何操作之前完成的? –

回答

30

位置:视图中的列表中的位置
ID:该被点击

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

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

+0

如果表中不包含'_id'字段,那么可以肯定地说位置和行ID是相同的? –

+4

似乎如果你使用的是一个arrayAdapter,它是一样的。该id将是Adapter.getItemId(int)的返回值,因此如果使用ArrayAdapter,它将与位置相同 - 快速搜索ArrayAdapter源代码显示它使用返回位置;编制id :) –

+3

这忽略了具有标题视图的'ListView'的情况。在这种情况下position = id + 1。[看我的回答](http://stackoverflow.com/a/24531354/383414) –

24

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)

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

+2

您发布的差异是非常关键的点在理解列表视图与标题..谢谢你很多你在这里的额外答案.. – Kushal

相关问题