Подтвердить что ты не робот

Практическое различие между идентификатором позиции и строки в 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 или некоторыми другими специальными возможностями?

4b9b3361

Ответ 1

позиция: позиция представления в списке
id: идентификатор строки элемента, который был нажат

Позиция начинается с 0, сверху вниз ListView, тогда как для получения правильного идентификатора строки важно, чтобы курсор, который был передан адаптеру, содержит столбец с именем "_id", представляющий уникальный идентификатор для каждой строки в таблице.

Если вы используете ArrayAdapter, position и id становятся прежними. Идентификатор будет возвращенным значением Adapter.getItemId(int), поэтому, если вы используете ArrayAdapter, он будет таким же, как и позиция - быстрый поиск исходного кода ArrayAdapter показывает его с использованием возвратной позиции; для разработки идентификатора.

Ответ 2

Ответ Lazy Ninja в основном правилен, однако не учитывает случай использования ArrayAdapter с представлением заголовка, добавленным вызовом метода ListView.addHeaderView(View).

Если ваш список имеет элемент заголовка, он будет в позиции 0.

Итак, первый "реальный" элемент в списке будет иметь:

  • position= 1
  • id= 0

В общем, position= id + number_of_header_views


Это важно, если вы решите добавить представление заголовка в список, который уже работает правильно.

Если вы обращаетесь к своим элементам с помощью position, то ваш код необходимо обновить по следующим строкам:

  • используйте position - 1 как индекс
  • используйте id как индекс
  • используйте ListView.getItemAtPosition(int) вместо Adapter.getItem(int)

Также см. этот вопрос для обсуждения: