2010-09-05 10 views
5

Sto provando a passare un array di oggetti Address a un'altra attività tramite un oggetto Intent.Come passare un array di oggetti Address a un altro Acitvity

Poiché la classe Address implementa l'interfaccia Parcelable, provo a eseguire quanto segue. Ho ottenuto un oggetto Address Address da un oggetto Geocoder, che ho convertito in una matrice di oggetti Address. Quindi metto questo array nell'Intento e richiamo l'attività.

final Address[] addresses = addresseList.toArray(new Address[addresseList.size()]); 

final Intent intent = new Intent(this, SelectAddress.class); 
intent.putExtra(SelectAddress.INTENT_EXTRA_ADDRESSES, startAddresses); 

startActivityForResult(intent, REQUEST_CODE_ACTIVITY_SELECT_ADDRESSES); 

Sull'altra attività, provo a recuperare l'indirizzo [] dall'intento con la seguente parte di codice. Ma la chiamata dell'ultima riga termina con ClassCastException Landroid.os.Parcelable.

Bundle bundle = getIntent().getExtras();    
Address[] addresses = (Address[]) bundle.getParcelableArray(INTENT_EXTRA_ADDRESSES); 

Cosa sto sbagliando? Come devo recuperare l'indirizzo [].

+0

"Ciao sto cercando di passare un array di oggetti di indirizzi in un'altra attività attraverso un oggetto Intent". -- perché? Per me, passare oggetti complessi tra le attività è un odore di codice. Pensa agli extra di 'Intent' come parametri GET su un URL. Se si trattasse di due pagine Web, passeresti un gruppo di oggetti 'Address' come parametri GET su un URL in un collegamento? Supponendo che passare una serie di oggetti 'Address' sia inevitabile, qual è il tipo di oggetto che stai recuperando? La linea 'ClassCastException' dovrebbe dirlo. – CommonsWare

+0

Il tipo indicato da ClassCastException è Landroid.os.Parcelable. – Flo

+0

Per quanto riguarda il problema relativo al passaggio di una serie di oggetti complessi a un'attività. Quello che voglio fare è fornire all'utente una seconda attività in cui è possibile selezionare da un elenco di indirizzi, quando la ricerca di un indirizzo nella prima attività ha restituito più risultati. Come implementeresti questo senza passare gli indirizzi alla seconda attività per visualizzarli in uno spinner, quindi l'utente può selezionarne uno? – Flo

risposta

13

Il problema è il casting. Prova:

Bundle bundle = getIntent().getExtras(); 
Parcelable[] parcels = bundle.getParcelableArray(INTENT_EXTRA_ADDRESSES); 

Address[] addresses = new Address[parcels.length]; 
for (Parcelable par : parcels){ 
    addresses.add((Address) par);    
} 
+7

la risposta è corretta , ma da quando hai potuto usare ".add" per aggiungere a un array? lol utilizzare questo: ** 'for (int i = 0; i Shehaaz

0

Il @LiorZanswer è completamente vero. Ho appena unito la sua risposta e this other in questa pratica funzione.

@SuppressWarnings("unchecked") 
private static <T extends Parcelable> T[] castParcelableArray(Class<T> clazz, Parcelable[] parcelableArray) { 
    final int length = parcelableArray.length; 
    final T[] array = (T[]) Array.newInstance(clazz, length); 
    for (int i = 0; i < length; i++) { 
     array[i] = (T) parcelableArray[i]; 
    } 
    return array; 
} 
4
 
or on java1.6: 
    Parcelable[] x = bundle.getParcelableArray(KEY); 
    addresses = Arrays.copyOf(x, x.length, Address[].class); 
+3

Benvenuti in StackOverflow! Anche se hai fornito una risposta, è meglio chiarire un po 'di più su cosa fornisce la tua soluzione e come aiuta l'OP nella sua domanda. –

+0

Aiuta nel modo in cui non è necessario scrivere un ciclo. Una riga invece. – Malachiasz

Problemi correlati