2010-09-05 17 views
5

Estoy tratando de pasar una matriz de objetos Address a otra Actividad a través de un objeto Intent.Cómo pasar una matriz de objetos de Dirección a otra Acitvity

Como la clase Address implementa la interfaz Parcelable, trato de hacer lo siguiente. Obtuve un objeto de Dirección de lista de un objeto Geocoder, que convierto en una matriz de objetos de Dirección. Luego coloco esta matriz en el Intento y llamo a la actividad.

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); 

Por otra actividad que tratan de recuperar la dirección [] de la intención con el siguiente fragmento de código. Pero la llamada de la última línea termina con una ClassCastException Landroid.os.Parcelable.

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

¿Qué estoy haciendo mal? ¿Cómo debo recuperar la dirección []?

+0

"Hola estoy tratando de pasar una matriz de objetos de dirección a otra actividad a través de un objeto Intención". -- ¿por qué? Para mí, pasar objetos complejos entre actividades es un olor a código. Considere los extras de 'Intent' como parámetros GET en una URL. Si se tratara de dos páginas web, ¿estaría pasando un conjunto de objetos 'Dirección' como parámetros GET en una URL en un enlace? Suponiendo que pasar una matriz de objetos 'Dirección' es inevitable, ¿cuál es el tipo de objeto que está recibiendo? La línea 'ClassCastException' debería decirte eso. – CommonsWare

+0

El tipo mencionado por ClassCastException es un Landroid.os.Parcelable. – Flo

+0

En relación con sus preocupaciones acerca de pasar una matriz de objetos complejos a una actividad. Lo que quiero hacer es proporcionar al usuario una segunda actividad en la que pueda seleccionar de una lista de direcciones, cuando la búsqueda de una dirección en la primera actividad haya arrojado resultados múltiples. ¿Cómo implementaría esto sin pasar las direcciones a la segunda actividad para mostrarlas en una rueda giratoria, para que el usuario pueda seleccionar una de ellas? – Flo

Respuesta

13

El problema es el casting. Proveedores:

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 respuesta es correcta , pero ¿desde cuándo podría usar ".add" para agregar a una matriz? lol use esto: ** 'for (int i = 0; i Shehaaz

0

El @LiorZanswer es del todo cierto. Acabo de fusionar su respuesta y this other en esta práctica función.

@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

¡Bienvenido a StackOverflow! Aunque hayas proporcionado una respuesta, es mejor aclarar un poco más sobre lo que ofrece tu solución y cómo ayuda al OP con su pregunta. –

+0

Ayuda en la forma en que no necesita escribir un bucle. Una línea en cambio. – Malachiasz

Cuestiones relacionadas