В чем разница между аргументом 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
это я получаю одинаковое значение для обоих аргументов.
5 ответов
Данные ответы очень полезны. Но нужный ответ, я имею в виду точный ответ, который я хотел, был опубликован в качестве комментария к вопросу самостоятельно. Но это не увеличит мой "уровень принятия". Поэтому я решил поставить ссылку в качестве ответа на вопрос. Вот ссылка на ответ.
У меня был такой же вопрос, как и у вас. Однако ответы здесь не были чрезвычайно полезны. Я не поддерживаю ответы "поищи сам", особенно когда так называемая документация так неясна. Я сам посмотрел, и вот что я нашел.
Значение int - это позиция представления в родительском элементе. Для ListView
, это номер строки. Верхний ряд - это позиция 0, второй ряд - это позиция 1, третий ряд - это позиция 2 и т. Д. Обратите внимание, что если ваш ListView
имеет вид заголовка (как если бы вы сделали ListView.addHeaderView(View)
) тогда представление заголовка будет позицией 0, а фактические строки начнут нумерацию с 1.
Иногда значение long совпадает с позицией int, а иногда оно отличается. Если вы используете ArrayAdapter
или же SimpleAdapter
тогда они одинаковы (за исключением случая, когда есть представление заголовка, а затем они отключены на один). Для CursorAdapter
(и, следовательно, SimpleCursorAdapter
) длинный идентификатор возвращает идентификатор строки таблицы, то есть _id
, Это скорее long, чем int, потому что в базе данных теоретически может быть больше строк, чем может содержать int, тогда как ListView
не будет.
Вот несколько других связанных ответов:
- https://stackru.com/a/25622142/3681880
- /questions/21468153/kakova-tsel-identifikatorov-elementov-v-android-listview-adapter/21468179#21468179
- /questions/32128080/prakticheskaya-raznitsa-mezhdu-pozitsiej-i-identifikatorom-stroki-v-onlistitemclick/32128087#32128087
- /questions/32128080/prakticheskaya-raznitsa-mezhdu-pozitsiej-i-identifikatorom-stroki-v-onlistitemclick/32128090#32128090
Попробуйте прочитать документацию.
int
это позиция просмотра, long
это идентификатор элемента.
(Мы не видим, что вы получаете одно и то же значение для обоих; мы видим только ваш код, а не экран.)
Значение int представляет позицию элемента, а long value представляет идентификатор элемента .,
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.
На мой взгляд, через позицию вы можете получить элемент строки с помощью адаптера getItem(position). Итак, позиция означает положение данных в адаптере.
Что касается параметра id, я думаю, что это метод справки, как вы знаете, данные в адаптере всегда являются записывающими устройствами. Вообще говоря, у регистратора должен быть столбец идентификатора (что-то вроде идентификатора базы данных). при кодировании вы можете получить элемент через позицию, затем получить идентификатор элемента (если элемент имеет идентификатор). но вы можете получить такой "id" напрямую с помощью параметра "id". Вы можете заметить: позиция типа int, а id - тип long.
Кстати, если вы хотите использовать параметр id, вы должны реализовать метод getItemId() в адаптере. орудие по умолчанию в ArrayAdapter просто возвращает позицию.