Какова цель идентификаторов элементов в Android ListView Adapter? - PullRequest
12 голосов
/ 24 февраля 2011

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

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

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

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

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

Ответы [ 5 ]

31 голосов
/ 25 марта 2012

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

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

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

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

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

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

  • запись с ID 43 будет иметь позицию 0 ,
  • запись с ID 67 будет иметь позицию 1 ,
  • запись с ID 85 будет иметь позицию 2

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

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

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

ArrayAdapter / SimpleAdapter

В ArrayAdapter и SimpleAdapter position и 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;
    }
}
3 голосов
/ 30 сентября 2014

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

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

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

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

1 голос
/ 26 марта 2012

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

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

0 голосов
/ 23 июля 2011

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

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

0 голосов
/ 24 февраля 2011

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

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

...