В чем разница между аргументом int и long в onItemClick в Android

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


person AnujAroshA    schedule 22.11.2011    source источник
comment
Я ясно понял... ссылка   -  person AnujAroshA    schedule 21.12.2011


Ответы (5)


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

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

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

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

person Suragch    schedule 02.09.2014

Попробуйте прочитать документация.

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

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

person Dave Newton    schedule 22.11.2011
comment
Я не могу загружать изображения, потому что я новичок в Stackoverflow, а также я прочитал документацию, и они объясняют это таким же образом. Мне нужно больше объяснений. Вот почему я разместил вопрос здесь. Я очень рад, если вы можете указать мне на пример кода, где я могу увидеть, как мы можем использовать эти последние два аргумента. - person AnujAroshA; 22.11.2011

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

person Community    schedule 14.06.2012

Значение 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.
person RajaReddy PolamReddy    schedule 22.11.2011
comment
В списке, когда мы нажимаем на элемент, этот обратный вызов возвращает позицию этого элемента. Итак, что такое идентификатор. Если вы можете объяснить что-то вроде этого, я буду очень благодарен. Я сделал свою домашнюю работу (прочитал документацию Android), прежде чем задать этот вопрос здесь. Поэтому, пожалуйста, объясните что-то большее, чем документ, или что-то другое. Спасибо (developer.android.com/reference/android/widget/) - person AnujAroshA; 22.11.2011
comment
давайте возьмем 5 элементов в списке, позиции начинаются с нуля, то есть (0,1,2,3,4) - это позиции для элементов, а идентификатор означает, что он будет автоматически генерироваться андроидом во время выполнения для распознавания элементов. - person RajaReddy PolamReddy; 22.11.2011
comment
Это вывод, который я получаю twitpic.com/7hq4yw для кода public void onItemClick(AdapterView‹?› parent, View arg1, int arg2, long arg3) { Toast.makeText(this, Clicked on: + arg2 + long arg: + arg3, Toast.LENGTH_LONG).show(); } @Polam, можешь объяснить, почему? Спасибо - person AnujAroshA; 22.11.2011
comment
Нажатие на: 1 означает, что вы нажали на элемент 2 сверху из-за элементов, начинающихся с 0 сверху. long arg : 1 это значение идентификатора элемента. почему вам потребовалось так много объяснений об идентификаторе, мы здесь не используем идентификатор, нам требуется pos, которого достаточно для использования предметов. - person RajaReddy PolamReddy; 22.11.2011
comment
@PolamReddyRajaReddy Да, я знаю, что массивы основаны на 0. Но я не могу понять, почему я получаю одинаковое значение для arg2 и arg3. Можете ли вы привести пример, где я могу получить разные значения для этих аргументов. Заранее спасибо. - person AnujAroshA; 22.11.2011

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

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

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

person David Guo    schedule 11.12.2013