Android:如何将List<GeoPoint>传递到另一个Activity?

8

我有一个类型为 GeoPoint 的 ArrayList。

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

我希望将points传递给另一个Activity,并在该Activity中检索数据。我该怎么做? 我知道我必须使用parcelable,但是我搜索了一下,没有找到一种传递ArrayList的方法。


你应该使用服务或静态类成员。通过extras传递大型数据对象不是一个好主意。 - Falmarri
定义大的额外参数 :) GeoPoint是一个只有两个整数的对象。但你是对的。如果它太大了,那么这是一个坏主意。但我认为地理点列表还可以。 - Patrick Boos
2
@Falmarri:静态类成员是全局变量,而全局变量是不好的,嗯? - hoffmanc
传递大量额外参数或使用静态变量。是不好的设计还是性能不佳?我在思考... - emeraldhieu
1个回答

25

这个函数将会帮助你: http://developer.android.com/reference/android/content/Intent.html#putParcelableArrayListExtra(java.lang.String, java.util.ArrayList<? extends android.os.Parcelable>)

然而问题在于,GeoPoint是不可序列化的。可以在此做一个变通处理:

1) 创建一个实现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) 当向另一个活动发送时(points是你的List<GeoPoint>):

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

3) 在被调用的活动中:

ArrayList<ParcelableGeoPoint> pointsExtra =  getIntent().getParcelableArrayListExtra("geopoints");
ArrayList<GeoPoint> points = new ArrayList<GeoPoint>();
foreach(ParcelableGeoPoint point: pointsExtra) { points.add(point.getGeoPoint()); }

代码应该能够工作,但未经过测试。


为什么会显示警告 Parcelable.Creator 是原始类型。对泛型类型 Parcelable.Creator<T> 的引用应进行参数化?我可以忽略它吗? - Rohith Nandakumar
我还不太明白这是如何工作的。你能告诉我应该做哪些更改才能通过 List<String> names 吗? - Rohith Nandakumar
1
传递字符串列表甚至更容易,但有点不同。请查看Intent函数intent.putStringArrayListExtra(...)和intent.getStringArrayListExtra(...)。它们是您所需的全部,无需额外的类。 - Patrick Boos
1
@PatrickBoos 有没有特别的原因不将GeoPoint扩展到实现Parcelable?看起来可以减少创建的对象数量,并且内部代码看起来更加简洁。我喜欢这里的IS-A选项,而不是HAS-A。 - Philipp Hanes
@PhilippHanes 没有特定的原因 :) 那样可能是更好的方式。 - Patrick Boos
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接