2011-10-22 95 views
2

我設置了一個列表視圖上的長單擊監聽器,我想使用單擊項目的索引來檢索相應的對象。根據android docsAndroid AdapterView點擊監聽器參數 - 位置和編號

public abstract boolean onItemLongClick (AdapterView<?> parent, View view, int position, long id) 

Parameters 
parent  The AbsListView where the click happened 
view  The view within the AbsListView that was clicked 
position The position of the view in the list 
id   The row id of the item that was clicked 

我的問題

方法簽名和參數的定義是將「位置」和「ID」始終是相同的?那些定義似乎是可以互換的,所以有什麼區別?

回答

1

位置和ID可能相同,但實際上取決於您使用的適配器。

基本上,適配器中的2個方法決定了ID是什麼 - 對於SimpleCursorAdapter(以及快速查看源代碼),它是創建遊標的查詢中的'_id'字段,但方法在支持id參數的適配器中有:

Adapter.getItemId(int)它允許適配器從位置轉換爲對象的id,而允許ListView(或任何使用適配器的緩存它)的Adapter.hasStableIds() - 儘管您可以可能忽略hasStableIds()。

的ID將是Adapter.getItemId(int)返回值,所以如果你使用一個ArrayAdapter這將是相同的位置 - 快速搜索一個ArrayAdapter源代碼顯示了它的使用return position;摸出ID :)

如果您使用自定義適配器,則完全取決於您。

1

ID是來自數據庫的ID(即_ID)。 position是Array或ArrayList中的位置。

例如:如果您在數據庫記錄中使用ID爲1,2,3,4,並使用SQL檢索記錄(並填充數組或ArrayList),則可能有一些過濾器(where子句)並顯示只有ID爲1和3的元素。這樣,您只有2個可能的position s - 0和1.

區別在於:您可能認爲行ID是某些外部ID,屬於數據行本身。相反,position「屬於」列表視圖,它是適配器。