2014-10-02 61 views
12

我正在實現自定義ArrayAdapter<T>,並且我想將hasStableIds設置爲true。但我T項的ID是字符串getItemId方法返回多頭帶有使用GUID或字符串作爲Ids的hasStableId的適配器

那麼,什麼我目前做的是:

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

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

getId()返回一個字符串。

這是使用String ID的正確解決方案嗎?
特別是,在這種情況下,字符串ID是GUID,是否有更好的選擇?

回答

2

您不想使用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 

對性能的影響可以忽略不計....

2

這是確定的,只要它是真實的,返回的ID保留是對同一個對象相同的改變之後,爲hasStableIds

+1

兩個不同的字符串可能會返回相同的hashCode()... – Niels 2016-10-04 08:38:13

+0

@Niels肯定!但是我的話無論如何都是對的。相同的字符串是相同的哈希值,即使它不是相同的字符串,但意外地具有相同的哈希值,它也是Java固有的。 – eduyayo 2016-10-04 08:41:02

1

你可以這樣做: 回報UUID.getLeastSignificantBits()

P/S:你可能不應該。 A long的大小是8個字節,而UUID的大小是16個字節。因此,UUID不能存儲在long中。 From Wikipedia

需要選擇標識符大小和生成過程,以便在實踐中使其不太可能。 因此,兩個不同的UUID可以具有相同的leastSignificantBits

相關問題