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

Адаптер с hasStableIds с использованием GUID или строк в качестве идентификаторов

Я реализую пользовательский ArrayAdapter<T>, и я хочу установить для параметра hasStableIds значение true. Но идентификаторы моих элементов T Строки, а метод getItemId возвращает longs.

Итак, что я сейчас делаю:

@Override
public boolean hasStableIds() {
    return true;
}

@Override
public long getItemId(int position) {
    return this.getItem(position).getId().hashCode();
}

Где getId() возвращает строку.

Является ли это правильным решением для использования String ids?
В частности, для этого случая идентификаторы строк являются идентификаторами GUID, есть ли лучший вариант?

4b9b3361

Ответ 1

Вы не хотите использовать hashCode(), потому что таким образом два разных GUID могут привести к тому же ID.

Просто скопируйте отображение. Что-то вроде этого...

private static class GuidToIdMap {
    private final Map<String, Long> guidToIdMapping = new HashMap<String, Long>();
    private final Map<Long, String> idToGuidMapping = new HashMap<Long, String>();

    private long idGenerator = 0;

    public long getIdByGuid(final String guid) {
        if ( ! guidToIdMapping.containsKey(guid)) {
            final long id = idGenerator++;
            guidToIdMapping.put(guid, id);
            idToGuidMapping.put(id,   guid);
        }
        return guidToIdMapping.get(guid);
    }

    public String getGuidById(final long id) {
        if (idToGuidMapping.containsKey(id)) {
            return idToGuidMapping.get(id);
        }
        return null;
    }
}


private final GuidToIdMap guidToIdMap = new GuidToIdMap();

@Override
public boolean hasStableIds() {
    return true;
}

@Override
public long getItemId(int position) {
    final String guid = this.getItem(position).getId();
    return guidToIdMap.getIdByGuid(guid);
}

// Use guidToIdMap.getGuidById(id) where the Android Framework passes you the generated id

Влияние производительности будет незначительным....

Ответ 2

Это нормально до тех пор, пока это правда, что возвращаемый идентификатор остается одним и тем же для одного объекта после изменений и уникален, как описано в javadoc для hasStableIds

Ответ 3

Вы можете сделать это:   return UUID.getLeastSignificantBits()

P/s: Вы, вероятно, не должны. Размер long - 8 байт, а размер UUID - 16 байт. Следовательно, UUID нельзя сохранить в long. Из Wikipedia:

Необходимо определить размер и процесс формирования идентификатора, чтобы сделать это на практике практически невозможным. Поэтому два разных UUID могут иметь один и тот же leastSignificantBits.