2012-10-19 88 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

相關問題