Адаптер с 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, есть ли лучший вариант?
Ответы
Ответ 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
.
Ответ 4
Нет, вы ошибаетесь. getItemId имеет сигнатуры метода буксировки, и один из них возвращает long per docs:
https://developer.android.com/reference/android/widget/Adapter.html#getItemId(int)