2

我在列表视图上设置了一个长点击监听器,我想使用被点击项目的索引来检索相应的对象。

根据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”总是一样的吗?这些定义似乎可以互换,那么有什么区别呢?

4

2 回答 2

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“属于”列表视图和它的适配器。

于 2011-10-22T13:42:18.543 回答
1

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

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

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

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

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

于 2011-10-22T14:30:20.230 回答