2010-11-10 19 views
6

Ich habe eine ArrayList des Typs GeoPoint.Android: Pass-Liste <GeoPoint> zu einer anderen Aktivität

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

Ich möchte points auf eine andere Tätigkeit zu übergeben und die Daten in dieser Tätigkeit retrive. Wie mache ich es? Ich weiß, dass ich die parcelable verwenden muss, aber ich suchte, konnte aber keine Möglichkeit finden, ArrayLists zu übergeben.

+0

Sie sollten einen Dienst oder ein statisches Klassenmitglied verwenden. Das Übergeben großer Datenobjekte über Extras ist keine gute Idee. – Falmarri

+0

definieren große Extras :) GeoPoint ist ein Objekt mit nur zwei Ints. Aber Sie haben Recht. Wenn es zu groß ist, dann ist es eine schlechte Idee. Aber eine Liste von Geopunkten ist okay, denke ich. –

+2

@Falmarri: statische Klassenmitglieder sind Globals, und Globals sind schlecht, mmmkay? – hoffmanc

Antwort

23

Diese Funktion wird Ihnen helfen: http://developer.android.com/reference/android/content/Intent.html#putParcelableArrayListExtra(java.lang.String, java.util.ArrayList <? erweitert android.os.Parcelable >)

Aber das Problem ist, dass GeoPoint nicht Parcelable ist. Nun, man kann eine Abhilfe tun hier:

1) Erstellen Sie eine Klasse, die implementiert Parcel:

 
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), wenn auf der anderen Tätigkeit Senden (Punkte ist Ihre Liste <GeoPoint>:

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

3) in der Aktivität genannt:

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

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

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

code sollte funktionieren, ist aber noch nicht getestet.

+0

Danke eine Million. Ich versuche das herauszufinden = D Was ist 'MyParcelable' in diesem Code? –

+0

oh entschuldigung. mein Fehler! MyParcelable stammt aus der Probe auf developer.android.com, die ich verwendet habe. MyParcelable sollte oben durch ParcelableGeoPoint ersetzt worden sein. :) gerade bearbeitet, um den Beitrag zu korrigieren. –

+0

:) Danke. ok du solltest auch "int long" in ParcelableGeoPoint (Parcel in) ändern :) Danke nochmal. –

Verwandte Themen