Android AdapterView 点击监听参数-位置&id

Posted

技术标签:

【中文标题】Android AdapterView 点击监听参数-位置&id【英文标题】:Android AdapterView Click Listener Parameters - position & id 【发布时间】:2011-12-13 04:19:09 【问题描述】:

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

根据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

我的问题是“位置”和“身份”总是相同的吗?这些定义似乎可以互换,那么有什么区别呢?

【问题讨论】:

【参考方案1】:

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

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

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

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

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

【讨论】:

【参考方案2】:

ID 是来自数据库的 ID(即 _ID)。 position 是 Array 或 ArrayList 中的位置。

例如:如果您的数据库记录中的 ID 为 1、2、3、4,并且您使用 SQL 检索记录(并填充数组或 ArrayList),您可能有一些过滤器(where 子句)并只显示ID 为 1 和 3 的元素。这样你就只有 2 个可能的 positions - 0 和 1。

不同之处在于:您可能认为行 ID 是一些外部 ID,属于数据行本身。相反position“属于”列表视图,它是适配器。

【讨论】:

以上是关于Android AdapterView 点击监听参数-位置&id的主要内容,如果未能解决你的问题,请参考以下文章

android : 如何实现移动进入一个view的监听事件

如何设置 android gridview 怎么设置 , 一些item可以点击,另外.....

android 中的appwidget中加了listview,怎么让点击listview中的item后跳转到app主页面

Android控件第3类——AdapterView

GridView 加监听器

AdapterView 不支持 Android 8.1/9.0 removeView(View)