Intereting Posts
Как сделать углы кнопки круглыми? Метод findViewById (int) не определен для типа Android, Java: HTTP POST Request Android: аудиозапись с визуализацией уровня голоса Cordova ubuntu: Произошла ошибка при отображении Android-целей Открытие PDF-файлов на веб-сайте Android без использования GoogleDocViewer Kivy – Plyer – Android – отправка уведомления, пока приложение не запущено Появилась ли новая функция «Видимость пароля» для сломанного существующего drawableRight для EditTexts? Создание виджета Android с помощью телефонной заставки Может подчеркивать слова в тексте TextView Изменение высоты панели действий на Android JellyBean Recyclerview внутри вложенного просмотра прокрутки, загружая все данные вместо вызова по одному изображению при прокрутке Уменьшить скользящую анимацию между действиями андроида? Android locationManager requestLocationUpdates не работает Android – изменение пользовательского заголовка во время выполнения

Какова цель идентификатора элемента в Android ListView Adapter?

(Не относится к ListView, но к адаптеру).

Я продолжаю реализовывать это, когда я подклассу BaseAdapter:

@Override public long getItemId(int position) { return position; } 

Потому что нужно это реализовать. Я не вижу его использования, мне нужно только getItem (позиция), а не getItemId (позиция).

Интересно, имеет ли это какое-либо значение (для Android SDK или что-то еще)?

Solutions Collecting From Web of "Какова цель идентификатора элемента в Android ListView Adapter?"

Вероятно, есть много причин иметь стабильные идентификаторы элементов. Реализация по умолчанию не может быть задана, поскольку она зависит от типа объекта, хранящегося в адаптере.

Android имеет проверку, чтобы убедиться, что идентификаторы элементов используются только в том случае, когда они установлены, т. getItemId Подкласс правильно переопределил getItemId ; BaseAdapter.hasStableIds необходимо переопределить, чтобы вернуть true.

Несколько причин, по которым я столкнулся:

  • Метод onItemClick(AdapterView<?> parent, View view, int position, long id) также отправляет long id

  • Метод getCheckedItemIds The result is only valid if the choice mode has not been set to CHOICE_MODE_NONE and the adapter has stable IDs.

Ответ на вопрос «Потому что нужно это реализовать» : вам не нужно. Если вы не используете эти функции, вам не нужно. Но если вы это сделаете, не забудьте также переопределить boolean hasStableIds() .

Представьте себе эту структуру:

У вас есть таблица db с такими 3 записями:

 +----+--------------------------+ | ID | Note Text | +----+--------------------------+ | 43 | Note text blah blah | | 67 | Note text blah blah blah | | 85 | Last note | +----+--------------------------+ 

И вы используете адаптер для обслуживания этих данных.

Теперь давайте посмотрим, какая позиция и идентификатор элемента находятся в таком случае

Position – порядковый номер позиции записи в загруженном наборе данных. Например, если вы загрузите эту таблицу с помощью ORDER BY ID ASC , тогда

  • Запись с идентификатором 43 будет иметь позицию 0 ,
  • Запись с идентификатором 67 будет иметь позицию 1 ,
  • Запись с идентификатором 85 будет иметь позицию 2

ItemId – это «первичный ключ» записи, и ваша реализация может вернуть такие значения

  • Запись с ID 43 должна иметь itemId 43 ,
  • Запись с идентификатором 67 должна иметь itemId 67 ,
  • Запись с идентификатором 85 должна иметь itemId 85

Position и itemId в стандартных адаптерах Android

ArrayAdapter / SimpleAdapter

В ArrayAdapter и SimpleAdapter и itemId это одно и то же:

 public long getItemId(int position) { return position; } 

SimpleCursorAdapter (и все типы, которые наследуются от CursorAdapter)

В SimpleCursorAdapter и всех потомках CursorAdapter itemId является значением из столбца _id:

 public long getItemId(int position) { if (mDataValid && mCursor != null) { if (mCursor.moveToPosition(position)) { return mCursor.getLong(mRowIDColumn); } else { return 0; } } else { return 0; } } 

Как пишет @Reno, он позволяет сопоставлять строки в представлении с элементами набора данных.

Одна из целей этого – позволить ListViews отслеживать, какой элемент выбран, даже если позиции в списке изменены или базовые данные обновляются.

Если вы подклассифицируете ArrayAdapter, вам может и не понадобиться реализовать этот метод.

В основном я нахожу, что этот метод полезен для определения того, какая строка была нажата во время событий onClick, и используйте этот идентификатор в качестве части дополнительных функций Intent, переданных следующему действию.

Да, это абстрактная функция, которая вызывается android для сопоставления идентификатора строки набора данных адаптера с вашим списком.

Вы можете копать глубже