2014-10-02 5 views
12

के रूप में GUIDs या स्ट्रिंग्स का उपयोग कर हैस्टेबल आईडी के साथ एडाप्टर मैं कस्टम ArrayAdapter<T> लागू कर रहा हूं, और मैं hasStableIds को सत्य पर सेट करना चाहता हूं। लेकिन मेरे टी आइटम के आईडी स्ट्रिंग्स और getItemId विधि लंबे समय लौटती हैं।आईडीएस

तो, मैं वर्तमान में कर रहा हूँ है:

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

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

कहाँ getId() एक स्ट्रिंग देता है।

क्या यह स्ट्रिंग आईडी का उपयोग करने के लिए सही समाधान है?
विशेष रूप से, इस मामले के लिए, स्ट्रिंग आईडी GUID हैं, क्या कोई बेहतर विकल्प है?

उत्तर

2

आप hashCode() का उपयोग नहीं करना चाहते हैं क्योंकि इस तरह, दो अलग-अलग GUIDS के परिणामस्वरूप एक ही आईडी हो सकती है।

बस मैपिंग कोड करें। कुछ इस तरह ...

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

यह रूप में लंबे समय यह सच है के रूप में है कि वापस आ आईडी परिवर्तन के बाद एक ही वस्तु के लिए एक ही किया जा रहा रखता है और यह अद्वितीय hasStableIds

+1

दो अलग स्ट्रिंग्स ही hashCode वापस कर सकती है() ... – Niels

+0

@Niels सुनिश्चित करें! लेकिन मेरा वाक्यांश वैसे भी सही है। वही स्ट्रिंग एक ही हैश है और यह जावा के लिए निहित है, भले ही यह एक ही स्ट्रिंग न हो लेकिन गलती से एक ही हैश हो। – eduyayo

0

नहीं आप कर रहे हैं गलत getItemId टो विधि हस्ताक्षर है और के लिए जावाडोक में वर्णित के रूप में है के लिए ठीक है उनमें से एक डॉक्स प्रति लंबे समय से प्रस्तुत करती है: https://developer.android.com/reference/android/widget/Adapter.html#getItemId(int)

1

आप ऐसा कर सकते हैं: वापसी UUID.getLeastSignificantBits()

पी/एस: आप शायद नहीं करना चाहिए। एक long का आकार 8 बाइट्स है जबकि यूयूआईडी का आकार 16 बाइट्स है। इसलिए UUID को long में संग्रहीत नहीं किया जा सकता है। Wikipedia से:

पहचानकर्ता आकार और पीढ़ी की प्रक्रिया को चुनने की आवश्यकता है ताकि यह अभ्यास में पर्याप्त रूप से असंभव हो सके। इसलिए, दो अलग-अलग यूयूआईडी में leastSignificantBits हो सकता है।

संबंधित मुद्दे

 संबंधित मुद्दे