Android AdapterView点击监听器参数 - 位置和放大器ID

时间:2011-10-22 13:33:21

标签: android onlongclicklistener android-adapterview

我在listview上设置了一个长按侦听器,我想使用所单击项的索引来检索相应的对象。

根据android docs

的方法签名和参数定义
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”总是一样吗?这些定义似乎可以互换,那有什么不同呢?

2 个答案:

答案 0 :(得分: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“属于”列表视图,它是适配器。

答案 1 :(得分:1)

位置和ID可能相同,但它实际上取决于您正在使用的适配器。

基本上,适配器中的2个方法指示ID将是什么 - 在SimpleCursorAdapter的情况下(并快速查看源代码),它是创建光标的查询中的“_id”字段,但是适配器中指定id参数的方法是:

Adapter.getItemId(int)允许适配器从位置转换为对象的id,而Adapter.hasStableIds()允许ListView(或使用适配器缓存它的任何东西) - 尽管你可以忽略hasStableIds ()。

id将是Adapter.getItemId(int)的返回值,因此如果您使用ArrayAdapter它将与位置相同 - 快速搜索ArrayAdapter源代码显示它使用return position;来计算id:)

如果您使用自定义适配器,那么完全取决于您。