我正在实施自定义ArrayAdapter<T>
,我想将hasStableIds
设置为true。但是我的T项的ID是字符串,getItemId
方法返回 longs 。
所以,我目前正在做的是:
@Override
public boolean hasStableIds() {
return true;
}
@Override
public long getItemId(int position) {
return this.getItem(position).getId().hashCode();
}
getId()
返回字符串。
这是使用String ID的正确解决方案吗? 特别是,对于这种情况,String Ids是GUID,有更好的选择吗?
答案 0 :(得分:4)
您不想使用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
性能影响可以忽略不计......
答案 1 :(得分:2)
只要确实返回的id在更改后对于同一个对象保持相同并且它是唯一的,如javadoc for hasStableIds
中所描述的那样是可以的答案 2 :(得分:1)
你可以这样做: return UUID.getLeastSignificantBits()
P / s:你可能不应该。 long
的大小为8字节,而UUID的大小为16字节。因此,UUID
无法存储在long
中。来自Wikipedia:
需要选择标识符大小和生成过程,以使其在实践中充分不可能。 因此,两个不同的UUID可以具有相同的
leastSignificantBits
。
答案 3 :(得分:-1)
不,你是不正确的getItemId有两个方法签名,其中一个返回多个文档: https://developer.android.com/reference/android/widget/Adapter.html#getItemId(int)