В чем разница между аргументом int и long в onItemClick в Android - PullRequest
15 голосов
/ 22 ноября 2011

Когда мы реализуем 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, я получаю одинаковое значение для обоих аргументов.

Ответы [ 5 ]

29 голосов
/ 02 сентября 2014

У меня был такой же вопрос, как и у вас.Однако ответы здесь не были чрезвычайно полезны.Я не поддерживаю ответы «поищи сам», особенно когда так называемая документация так неясна.Я сам посмотрел, и вот что я нашел.

Значение int является позицией представления в родительском .Для ListView это номер строки.Верхняя строка - это позиция 0, вторая строка - это позиция 1, третья строка - это позиция 2 и т. Д. Обратите внимание, что если у вашего ListView есть представление заголовка (как если бы вы сделали ListView.addHeaderView(View)), то представление заголовка будет позицией0 и фактические строки начнут нумерацию с 1.

Иногда значение long совпадает с положением int , а иногда оно отличается.Если вы используете ArrayAdapter или SimpleAdapter, то они одинаковы (за исключением случая, когда есть представление заголовка, а затем они отключаются на единицу).Для CursorAdapter (и, следовательно, SimpleCursorAdapter) идентификатор long возвращает идентификатор строки таблицы, то есть _id.Это long , а не int , потому что в базе данных теоретически может быть больше строк, чем может int , тогда как ListView не будет.

Вот несколько других связанных ответов:

4 голосов
/ 22 ноября 2011

Рекомендуем прочитать документацию .

int - это позиция просмотра, long - идентификатор элемента.

(Мы не видимчто вы получаете одинаковое значение для обоих; мы видим только ваш код, а не экран.)

2 голосов
/ 14 июня 2012

Данные ответы очень полезны. Но нужный ответ, я имею в виду точный ответ, который я хотел, был опубликован в качестве комментария к вопросу самостоятельно. Но это не увеличит мой уровень принятия. Поэтому я решил поставить ссылку в качестве ответа на вопрос. Вот ссылка на ответ.

1 голос
/ 11 декабря 2013

По моему мнению, через позицию вы можете получить элемент строки с помощью getItem (position) адаптера.Итак, позиция означает положение данных в адаптере.

Для параметра id, я думаю, это метод справки, как вы знаете, данные в адаптере всегда являются записывающими устройствами.Вообще говоря, у регистратора должен быть столбец идентификатора (что-то вроде идентификатора базы данных).при кодировании вы можете получить элемент через позицию, затем получить идентификатор элемента (если элемент имеет идентификатор).но вы можете получить такой «id» напрямую с помощью параметра «id».вы можете заметить: позиция имеет тип int, а id - длинный тип.

Кстати, если вы хотите использовать параметр id, вам нужно реализовать метод getItemId () в адаптере,орудие по умолчанию в ArrayAdapter просто возвращает позицию.

1 голос
/ 22 ноября 2011

int значение представляет положение элемента, а long значение представляет элемент 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.
...