2014-10-02 23 views
12

sto implementando una consuetudine ArrayAdapter<T>, e voglio impostare il hasStableIds su true. Ma gli ID dei miei articoli T sono Strings e il metodo restituisce getItemIdanela.Adattatore con hasStableIds utilizzando GUID o stringhe come Ids

Quindi, quello che sto facendo attualmente è:

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

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

Dove getId() restituisce una stringa.

È questo la soluzione corretta per l'utilizzo di identificatori di stringa?
In particolare, per questo caso, gli identificatori di stringa sono GUID, c'è una soluzione migliore?

risposta

2

non si desidera utilizzare il hashCode() perché in questo modo, due diversi GUID potrebbe comportare lo stesso ID.

codice appena una mappatura. Qualcosa di simile ...

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 

Impatto sulle prestazioni sarà trascurabile ....

2

E 'ok per il tempo che è vero che l'id restituita continua ad essere lo stesso per lo stesso oggetto dopo le modifiche ed è unico, come descritto nel Javadoc per hasStableIds

+1

due diverse stringhe potrebbero restituire lo stesso hashCode() ... – Niels

+0

@Niels sicuro! Ma la mia frase è giusta comunque. La stessa stringa è lo stesso hash e inerente a java anche quando non è la stessa stringa ma ha lo stesso hash casualmente. – eduyayo

1

Si può fare questo: UUID.getLeastSignificantBits di ritorno()

P/s: probabilmente non dovrebbe. La dimensione di long è di 8 byte mentre la dimensione di un UUID di 16 byte. Quindi un UUID non possono essere memorizzati in un long. Da Wikipedia:

Le dimensioni identificatore e processo di generazione devono essere scelti in modo da rendere questo sufficientemente improbabile in pratica. Pertanto, due UUIDs diversi possono avere lo stesso leastSignificantBits.