Практическое различие между идентификатором позиции и строки в onListItemClick()
Я смущен различием между postion
и row id
в ListActivity.onListItemClick()
.
В документации есть следующее:
position The position of the view in the list
id The row id of the item that was clicked
Есть ли какая-то практическая разница между этими двумя? Я предполагаю, что, поскольку существуют два разных параметра, существуют ситуации, когда значения отличаются друг от друга, но на основе формулировки, используемой в документации, трудно понять, что это может быть. Является ли это тем, что один из них может содержать значение идентификатора строки базы данных, предоставленного Cursor
или некоторыми другими специальными возможностями?
Ответы
Ответ 1
позиция: позиция представления в списке
id: идентификатор строки элемента, который был нажат
Позиция начинается с 0, сверху вниз ListView, тогда как для получения правильного идентификатора строки важно, чтобы курсор, который был передан адаптеру, содержит столбец с именем "_id", представляющий уникальный идентификатор для каждой строки в таблице.
Если вы используете ArrayAdapter, position
и id
становятся прежними. Идентификатор будет возвращенным значением Adapter.getItemId(int)
, поэтому, если вы используете ArrayAdapter, он будет таким же, как и позиция - быстрый поиск исходного кода ArrayAdapter
показывает его с использованием возвратной позиции; для разработки идентификатора.
Ответ 2
Ответ Lazy Ninja в основном правилен, однако не учитывает случай использования ArrayAdapter
с представлением заголовка, добавленным вызовом метода ListView.addHeaderView(View)
.
Если ваш список имеет элемент заголовка, он будет в позиции 0.
Итак, первый "реальный" элемент в списке будет иметь:
В общем, position
= id
+ number_of_header_views
Это важно, если вы решите добавить представление заголовка в список, который уже работает правильно.
Если вы обращаетесь к своим элементам с помощью position
, то ваш код необходимо обновить по следующим строкам:
- используйте
position - 1
как индекс
- используйте
id
как индекс
- используйте
ListView.getItemAtPosition(int)
вместо Adapter.getItem(int)
Также см. этот вопрос для обсуждения: