使用GUID或字符串作为ID的hasStableIds适配器

pom*_*ber 15 android listview android-arrayadapter baseadapter

我正在实现一个自定义ArrayAdapter<T>,我想将其设置hasStableIds为true.但我的T项的ID是字符串,getItemId方法返回long.

所以,我目前正在做的是:

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

@Override
public long getItemId(int position) {
    return this.getItem(position).getId().hashCode();
}
Run Code Online (Sandbox Code Playgroud)

getId()返回一个字符串.

这是使用String ID的正确解决方案吗?
特别是,对于这种情况,String Ids是GUID,有更好的选择吗?

Nie*_*els 5

您不想使用,hashCode()因为这样,两个不同的GUIDS可能会产生相同的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
Run Code Online (Sandbox Code Playgroud)

性能影响可以忽略不计。