15

当我们实现时OnItemClickListener,我们必须实现onItemClick方法,它是OnItemClickListener接口中的抽象方法。在onItemClick方法中有四个参数。

public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
    Toast.makeText(this, "Clicked on : " + arg2 + " long arg : " + arg3, 
                   Toast.LENGTH_LONG).show();
}

我需要知道的是最后两个参数(int arg2, long arg3)之间的区别。正如您在我的代码中看到的那样,当我尝试Toast它时,两个参数的值相同。

4

5 回答 5

35

我和你有同样的问题。但是,这里的答案并不是很有帮助。我不支持自行查找答案,尤其是在所谓的文档不清楚的情况下。不过,我确实自己查了一下,以下是我发现的。

int值是视图parent中的位置。对于 a ListView,它是行号。第一行是位置 0,第二行是位置 1,第三行是位置 2,依此类推。请注意,如果您ListView有一个标题视图(就像您这样做ListView.addHeaderView(View)),那么标题视图将是位置 0,而实际行将从 1 开始编号。

有时long值与int位置相同,有时则不同。如果您使用的是ArrayAdapterorSimpleAdapter那么它们是相同的(除非有一个标题视图然后它们被关闭)。对于 a CursorAdapter(以及因此 a SimpleCursorAdapter),id 返回表的行 id,即_id。它是long而不是int,因为理论上数据库可以拥有比int可以容纳的行数更多的行,而 aListView不会。

以下是其他一些相关的答案:

于 2014-09-02T11:31:24.157 回答
3

考虑阅读文档

int视图位置,long是项目 ID。

(我们看不到您为两者获得相同的值;我们只看到您的代码,而不是您的屏幕。)

于 2011-11-22T05:08:36.460 回答
2

给出的答案非常有帮助。但是需要的答案,我的意思是我想要的确切答案是我自己作为问题的评论发布的。但这不会增加我的“接受程度”。所以我想把链接作为问题的答案。这是答案的链接。

于 2012-06-14T10:48:10.233 回答
1

在我看来,通过位置,您可以使用适配器的getItem(位置)获取行项。因此,位置表示适配器中的数据位置。

对于 id 参数,我认为它是一种帮助方法,如您所知,适配器中的数据始终是一个记录器。一般来说,记录器应该有一个 id 列(类似于数据库 id)。编码时,可以通过位置获取item,然后获取item的id(如果item有id)。但是您可以使用“id”参数直接获取这样的“id”。您可能会注意到:位置是“int”类型,而“id”是“long”类型。

顺便说一句,如果要使用 id 参数,则必须在适配器中实现 getItemId() 方法。ArrayAdapter 中的默认实现只是返回位置。

于 2013-12-11T02:42:34.100 回答
1

int值表示item 的位置long值表示 item id。.

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

parent      The AdapterView where the click happened.
view        The view within the AdapterView that was clicked
            (this will be a view provided by the adapter)
position    The position of the view in the adapter.
id          The row id of the item that was clicked.
于 2011-11-22T05:10:02.770 回答