2010-11-10 24 views
6

Tengo una ArrayList de tipo GeoPoint.Android: Pase la lista <GeoPoint> a otra actividad

private List<GeoPoint> points = new ArrayList<GeoPoint>(); 

quiero pasar a otra actividad points y retrive los datos en esa actividad. ¿Cómo lo hago? Sé que tengo que usar el parcelable pero busqué, pero no pude encontrar una manera de pasar ArrayLists.

+0

Debe usar un servicio o un miembro de clase estática. No es una buena idea pasar grandes objetos de datos a través de extras. – Falmarri

+0

define extras grandes :) GeoPoint es un objeto con solo dos entradas. Pero tienes razón. Si es demasiado grande, entonces es una mala idea. Pero una lista de geopoints está bien, creo. –

+2

@Falmarri: los miembros de clase estáticos son globales, y los globales son malos, mmmkay? – hoffmanc

Respuesta

23

Esta función le ayudará: http://developer.android.com/reference/android/content/Intent.html#putParcelableArrayListExtra(java.lang.String, java.util.ArrayList <? extends android.os.Parcelable >)

Pero el problema es que GeoPoint no es Parcelable. Así, se puede hacer una solución aquí:

1) Crear una clase, que implementa parcelable:

 
public class ParcelableGeoPoint implements Parcelable { 

    private GeoPoint geoPoint; 

    public ParcelableGeoPoint(GeoPoint point) { 
      geoPoint = point; 
    } 

    public GeoPoint getGeoPoint() { 
      return geoPoint; 
    } 

    public int describeContents() { 
     return 0; 
    } 

    public void writeToParcel(Parcel out, int flags) { 
     out.writeInt(geoPoint.getLatitudeE6()); 
     out.writeInt(geoPoint.getLongitudeE6()); 
    } 

    public static final Parcelable.Creator<ParcelableGeoPoint> CREATOR 
      = new Parcelable.Creator<ParcelableGeoPoint>() { 
     public ParcelableGeoPoint createFromParcel(Parcel in) { 
      return new ParcelableGeoPoint(in); 
     } 

     public ParcelableGeoPoint[] newArray(int size) { 
      return new ParcelableGeoPoint[size]; 
     } 
    }; 

    private ParcelableGeoPoint(Parcel in) { 
     int lat = in.readInt(); 
     int lon = in.readInt(); 
     geoPoint = new GeoPoint(lat, lon); 
    } 
} 

2) cuando se envía a la otra actividad (puntos es su lista <GeoPoint>:

 
ArrayList<ParcelableGeoPoint> pointsExtra = new ArrayList<ParcelableGeoPoint>(); 
foreach(GeoPoint point: points) { 
    pointsExtra.add(new ParcelableGeoPoint(point)); 
} 
intent.putExtra("geopoints", pointsExtra); 

3) en la llamada actividad:

 
ArrayList<ParcelableGeoPoint> pointsExtra = getIntent().getParcelableArrayListExtra("geopoints"); 

ArrayList<GeoPoint> points = new ArrayList<GeoPoint>(); 

foreach(ParcelableGeoPoint point: pointsExtra) { 
    points.add(point.getGeoPoint()); 
} 

código debería funcionar, pero no se ha probado.

+0

Gracias un millón. Estoy tratando de resolver esto = D ¿Qué es 'MyParcelable' en este código? –

+0

oh lo siento. ¡mi error! MyParcelable está fuera de la muestra en developer.android.com que utilicé. MyParcelable debería haber sido reemplazado por ParcelableGeoPoint arriba. :) acaba de editar para corregir la publicación. –

+0

:) Gracias. ok también deberías cambiar 'int long' en ParcelableGeoPoint (Parcela) :) Gracias de nuevo. –

Cuestiones relacionadas