2013-02-16 1 views
15

Sto cercando di passare LinkedHashMap tra le attività, il mio codice è come questoAndroid Come passare LinkedHashMap tra le attività?

Attività A

LinkedHashMap mLinkedHashMap = new LinkedHashMap<String, Object>(); 
// setting data in map 
Bundle bundle = new Bundle(); 
bundle.putSerializable("OBJECTS_LINKED_HASHMAP", mLinkedHashMap); 
Intent intent = new Intent(this, ActivityB.class); 
intent.putExtras(bundle); 
startActivity(intent); 

in attività quando ricevo oggetto fascio sto ottenendo "calco eccezione" messaggio di errore

Attività B

Bundle bundle = this.getIntent().getExtras(); 
LinkedHashMap mLinkedHashMap = new LinkedHashMap<String, Object>(); 
mLinkedHashMap = (LinkedHashMap<String, Object>) bundle.getSerializable("OBJECTS_LINKED_HASHMAP"); 

Come eccezioni classe del cast

ClassCastException: java.util.HashMap cannot be cast to LinkedHashMap 

Ho controllato la documentazione LinkedHashMap implementando anche un'interfaccia Serializable.

Sto usando LinkedHashMap perché voglio mantenere l'ordine degli oggetti, nel modo in cui sono inseriti voglio tornare in ordine.

Come passare LinkedHashMap tra le attività?

+0

Impossibile inserire/estrarre una 'LinkedHashMap' da/per un' Intento' perché Android converte 'LinkedHashMap' in un' HashMap' quando serializzi 'Mappa' nel' Bundle' in 'Intento'. Sul lato ricevente si ottiene un 'HashMap' e l'ordinamento di' LinkedHashMap' è scomparso. Devi convertire 'LinkedHashMap' in un array ordinato e passarlo nell'Intento', o usare un altro meccanismo serialize/deserialize. IMHO aggiungendo una libreria GSON per fare ciò è eccessivo, ma ci sono altre scelte più performanti. –

+0

Vedi http://stackoverflow.com/questions/12300886/linkedlist-put-into-intent-extra-gets-recast-to-arraylist-when-retrieving-in-nex/12305459#12305459 per ulteriori dettagli sanguinosi –

risposta

17

Prova GSON per il cambiamento :)

Scarica gson.jar da questo link

E aggiungere GSON -2.2.2.jar file nel tuo progetto.
Ora passare i vostri LinkedHashMap ad un'altra attività utilizzando GSON

come questo (modificato questa sottostante Codice secondo il vostro bisogno):

MainActivity :::

public class MainActivity extends Activity { 
    ObjectClass obj=new ObjectClass(); 
    LinkedHashMap<String, ObjectClass> mLinkedHashMap = new LinkedHashMap<String, ObjectClass>(); 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 


     obj.id=1; 
     obj.name="hello"; 

     mLinkedHashMap.put("test", obj); 

     Gson gson = new Gson(); 
     String list = gson.toJson(mLinkedHashMap); 
     Intent intent = new Intent(this, secondActivity.class); 
     intent.putExtra("list", list); 
     startActivity(intent); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.activity_main, menu); 
     return true; 
    } 
} 

secondActivity :::

public class secondActivity extends Activity { 
    LinkedHashMap<String, ObjectClass> mLinkedHashMap = new LinkedHashMap<String, ObjectClass>(); 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
    String str= getIntent().getStringExtra("list"); 
    Gson gson = new Gson(); 

    Type entityType = new TypeToken< LinkedHashMap<String, ObjectClass>>(){}.getType(); 
    mLinkedHashMap = gson.fromJson(str, entityType); 
    ObjectClass obj = mLinkedHashMap.get("test"); 

    Log.i("list", ""+obj.id); 
    } 
} 

Lavorato per me. Spero che questo ti sia d'aiuto.

E qui è la mia classe oggetto per riferimento.

public class ObjectClass { 

    public int id; 
    public String name; 

    public int getId() { 
     return id; 
    } 
    public void setId(int id) { 
     this.id = id; 
    } 
    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 


} 

Come aggiungere file di GSON-2.2.2.jar.

1) copia il tuo gson-2.2.2.jar dalla cartella scaricata "google-gson-2.2.2".
2) incollarlo nella cartella delle risorse del progetto.
3) ora vai al tuo progetto buildpath facendo clic destro sul tuo progetto> Costruisci percorso> Configura percorso build ..
4) Si aprirà una finestra di dialogo selezionare il percorso di configurazione java dal menu di destra e andare al tag libreria quindi
Fare clic sul pulsante "Aggiungi giare ..." come puoi vedere nell'immagine sottostante
si aprirà un'altra finestra di dialogo per aggiungere jar. qui seleziona il file gson-2.2.2.jar che abbiamo aggiunto nella cartella delle risorse del progetto (passaggio 2).
Aggiungerà jar al tuo progetto (l'ho già aggiunto al mio progetto come puoi vedere nell'immagine sottostante)

enter image description here 5) Ora seleziona il tag Ordine ed Esporta e seleziona il tuo gson-2.2.2.jar (vedi sotto Immagine).
enter image description here 6) Premere OK e ora è possibile utilizzare GSON nel progetto

+0

Grazie @BaZinga Funziona bene +1 per questo –

+0

Sì Android, questa è una cattiva idea. Le chiamate al metodo virtuale sono costose, molto più delle ricerche sul campo di istanze. È ragionevole seguire pratiche di programmazione orientate agli oggetti comuni e avere getter e setter nell'interfaccia pubblica, ma all'interno di una classe si dovrebbe sempre accedere direttamente ai campi. –

+0

Senza un JIT, l'accesso diretto al campo è di circa 3 volte più veloce di un richiamo banale. Con il JIT (dove l'accesso diretto al campo è economico come l'accesso a un locale), l'accesso diretto al campo è circa 7 volte più veloce di un semplice getter. Questo è vero in Froyo, ma migliorerà in futuro quando la JIT inline metodi getter. –

3

A LinkedHashMap <> non è Parcelable o Serializable

EDIT:

Controllare questo:

serialize/deserialize a LinkedHashMap (android) java

+0

è lì un modo per ottenere lo stesso risultato? – Mac

+0

Prova Pragnani rispondi –

+1

@Mac hai torto ... LinkedHashMap è serializzabile consulta questo http://docs.oracle.com/javase/1.4.2/docs/api/java/util/LinkedHashMap.html – Pragnani

3

Edit:

Basato sul link fornito da Manish Android la soluzione è

if (getIntent().getSerializableExtra("OBJECTS_LINKED_HASHMAP") != null) 
       HashMap<?, ?> user_info = (HashMap<?, ?>) getIntent().getSerializableExtra("OBJECTS_LINKED_HASHMAP"); 


    LinkedHashMap<String, Object> userdata= (LinkedHashMap<String, Object>) user_info 

è necessario per ottenere il come questo

if (getIntent().getSerializableExtra("OBJECTS_LINKED_HASHMAP") != null) 
     LinkedHashMap<String, Object> user_info = (LinkedHashMap<String, Object>) getIntent().getSerializableExtra("OBJECTS_LINKED_HASHMAP"); 
+0

Sto usando e sta lavorando per me – Pragnani

+0

non ci sono problemi con "null" getIntent(). GetSerializableExtra ("OBJECTS_LINKED_HASHMAP"); non sta restituendo l'oggetto LinkedHashMap, invece che il suo oggetto HashMap di ritorno, e per questo sto ricevendo ClassCastException – Mac

+0

@Mac: quale valore stai passando al posto di Object? se qualche oggetto di classe personalizzato allora la classe deve implementare un'interfaccia serializzabile –

0

Passo come array di byte, quindi deserializzare e cast a un LinkedHashMap in attività di destinazione.