将 LinkedList 传递给另一个 activity
Pass LinkedList to another activity
我在一个 activity (A) 中有一个链接列表,我想与另一个 Activity (B) 共享。
该列表包含字符串类型的用户名和 LatLng 类型的坐标。我还使用 Intent 和 bundle 在活动之间共享数据。我尝试使用 Parcelable 但无法弄清楚如何使用它。这是我的代码:
data.java
public class data implements Parcelable{
private LatLng coordinates;
private String name;
public data() {
name = null;
coordinates = null;
}
public data(String name, LatLng coordinates)
{
this.name = name;
this.coordinates = coordinates;
}
public data(Parcel in) {
coordinates = in.readParcelable(LatLng.class.getClassLoader());
name = in.readString();
}
public static final Creator<data> CREATOR = new Creator<data>() {
@Override
public data createFromParcel(Parcel in) {
return new data(in);
}
@Override
public data[] newArray(int size) {
return new data[size];
}
};
public LatLng getLatLng () {
return coordinates;
}
@Override
public int describeContents() {
return hashCode();
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeParcelable(coordinates, flags);
}
}
Activity一个
public class A extends FragmentActivity implements
OnMapReadyCallback,
GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener,
GoogleMap.OnMyLocationButtonClickListener,
ActivityCompat.OnRequestPermissionsResultCallback {
Button switchToSeek;
double mLatitude;
double mLongitude;
LinkedList<data> storedData = new LinkedList<>();
protected void onCreate(Bundle savedInstanceState) {
...
switchToSeek.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getCurrentLocation();
Intent intent = new Intent(A.this, B.class);
Bundle xy = new Bundle();
xy.putDouble("x", mLatitude);
xy.putDouble("y", mLongitude);
xy.putParcelable("list", storedData); <---------- error: wrong second arugment
intent.putExtra("xy", xy);
A.this.startActivity(intent);
}
});
Activity B
public class B extends FragmentActivity implements OnMapReadyCallback {
double mLatitude;
double mLongitude;
LatLng current;
GoogleMap gMap;
LinkedList <data> copyData = new LinkedList<>();
@Override
public void onMapReady(GoogleMap googleMap) {
gMap = googleMap;
...
Intent intent = getIntent();
Bundle xy = intent.getBundleExtra("xy");
if (xy != null) {
mLatitude = xy.getDouble("x");
mLongitude = xy.getDouble("y");
}
/***** Call linked list here and set equal to copyData *****/
current = new LatLng(mLatitude, mLongitude);
gMap.moveCamera(CameraUpdateFactory.newLatLngZoom(current, 18.0f));
}
没有简单的方法来做到这一点,因为 LinkedList 没有实现可序列化或可打包。
您可以实现自己的链表 class 并使其成为 serializable/parcelable 对象,然后可以将其传递。
或者您可以将其内容转换为另一种数据类型,例如数组,然后重新创建链表。*这是非常低效的
我相信还有其他方法,但这是 android 开发中的标准问题。如果可能的话,也许尝试使用片段并通过 setter()
传递链表
如果列表不是很大,您可以使用以下帮助程序 class:
public class ParcelableLinkedList<E extends Parcelable> implements Parcelable {
private final LinkedList<E> linkedList;
public final Creator<ParcelableLinkedList> CREATOR = new Creator<ParcelableLinkedList>() {
@Override
public ParcelableLinkedList createFromParcel(Parcel in) {
return new ParcelableLinkedList(in);
}
@Override
public ParcelableLinkedList[] newArray(int size) {
return new ParcelableLinkedList[size];
}
};
public ParcelableLinkedList(Parcel in) {
// Read size of list
int size = in.readInt();
// Read the list
linkedList = new LinkedList<E>();
for (int i = 0; i < size; i++) {
linkedList.add((E)in.readParcelable(ParcelableLinkedList.class.getClassLoader()));
}
}
public ParcelableLinkedList(LinkedList<E> linkedList) {
this.linkedList = linkedList;
}
LinkedList<E> getLinkedList() {
return linkedList;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel parcel, int flags) {
// Write size of the list
parcel.writeInt(linkedList.size());
// Write the list
for (E entry : linkedList) {
parcel.writeParcelable(entry, flags);
}
}
}
在您的 onClick()
方法中,像这样将数据添加到 Bundle
:
xy.putParcelable("list", new ParcelableLinkedList<data>(storedData));
要从 Bundle
中提取数据,请执行以下操作:
copyData = ((ParcelableLinkedList<data>)xy.getParcelable("list")).getLinkedList();
我还没有实际编译和测试这段代码,但它应该可以工作。
如果列表真的很大,最好将它存储在一个 class 的 static
成员变量中,然后从另一个中引用它。这通常不是您想要在 Android 中做事的方式,但有时这样做比序列化和反序列化大量数据只是为了在有权访问的 2 个活动之间传递数据更方便相同的内存 space.
我在一个 activity (A) 中有一个链接列表,我想与另一个 Activity (B) 共享。 该列表包含字符串类型的用户名和 LatLng 类型的坐标。我还使用 Intent 和 bundle 在活动之间共享数据。我尝试使用 Parcelable 但无法弄清楚如何使用它。这是我的代码:
data.java
public class data implements Parcelable{
private LatLng coordinates;
private String name;
public data() {
name = null;
coordinates = null;
}
public data(String name, LatLng coordinates)
{
this.name = name;
this.coordinates = coordinates;
}
public data(Parcel in) {
coordinates = in.readParcelable(LatLng.class.getClassLoader());
name = in.readString();
}
public static final Creator<data> CREATOR = new Creator<data>() {
@Override
public data createFromParcel(Parcel in) {
return new data(in);
}
@Override
public data[] newArray(int size) {
return new data[size];
}
};
public LatLng getLatLng () {
return coordinates;
}
@Override
public int describeContents() {
return hashCode();
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeParcelable(coordinates, flags);
}
}
Activity一个
public class A extends FragmentActivity implements
OnMapReadyCallback,
GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener,
GoogleMap.OnMyLocationButtonClickListener,
ActivityCompat.OnRequestPermissionsResultCallback {
Button switchToSeek;
double mLatitude;
double mLongitude;
LinkedList<data> storedData = new LinkedList<>();
protected void onCreate(Bundle savedInstanceState) {
...
switchToSeek.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getCurrentLocation();
Intent intent = new Intent(A.this, B.class);
Bundle xy = new Bundle();
xy.putDouble("x", mLatitude);
xy.putDouble("y", mLongitude);
xy.putParcelable("list", storedData); <---------- error: wrong second arugment
intent.putExtra("xy", xy);
A.this.startActivity(intent);
}
});
Activity B
public class B extends FragmentActivity implements OnMapReadyCallback {
double mLatitude;
double mLongitude;
LatLng current;
GoogleMap gMap;
LinkedList <data> copyData = new LinkedList<>();
@Override
public void onMapReady(GoogleMap googleMap) {
gMap = googleMap;
...
Intent intent = getIntent();
Bundle xy = intent.getBundleExtra("xy");
if (xy != null) {
mLatitude = xy.getDouble("x");
mLongitude = xy.getDouble("y");
}
/***** Call linked list here and set equal to copyData *****/
current = new LatLng(mLatitude, mLongitude);
gMap.moveCamera(CameraUpdateFactory.newLatLngZoom(current, 18.0f));
}
没有简单的方法来做到这一点,因为 LinkedList 没有实现可序列化或可打包。
您可以实现自己的链表 class 并使其成为 serializable/parcelable 对象,然后可以将其传递。
或者您可以将其内容转换为另一种数据类型,例如数组,然后重新创建链表。*这是非常低效的
我相信还有其他方法,但这是 android 开发中的标准问题。如果可能的话,也许尝试使用片段并通过 setter()
传递链表如果列表不是很大,您可以使用以下帮助程序 class:
public class ParcelableLinkedList<E extends Parcelable> implements Parcelable {
private final LinkedList<E> linkedList;
public final Creator<ParcelableLinkedList> CREATOR = new Creator<ParcelableLinkedList>() {
@Override
public ParcelableLinkedList createFromParcel(Parcel in) {
return new ParcelableLinkedList(in);
}
@Override
public ParcelableLinkedList[] newArray(int size) {
return new ParcelableLinkedList[size];
}
};
public ParcelableLinkedList(Parcel in) {
// Read size of list
int size = in.readInt();
// Read the list
linkedList = new LinkedList<E>();
for (int i = 0; i < size; i++) {
linkedList.add((E)in.readParcelable(ParcelableLinkedList.class.getClassLoader()));
}
}
public ParcelableLinkedList(LinkedList<E> linkedList) {
this.linkedList = linkedList;
}
LinkedList<E> getLinkedList() {
return linkedList;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel parcel, int flags) {
// Write size of the list
parcel.writeInt(linkedList.size());
// Write the list
for (E entry : linkedList) {
parcel.writeParcelable(entry, flags);
}
}
}
在您的 onClick()
方法中,像这样将数据添加到 Bundle
:
xy.putParcelable("list", new ParcelableLinkedList<data>(storedData));
要从 Bundle
中提取数据,请执行以下操作:
copyData = ((ParcelableLinkedList<data>)xy.getParcelable("list")).getLinkedList();
我还没有实际编译和测试这段代码,但它应该可以工作。
如果列表真的很大,最好将它存储在一个 class 的 static
成员变量中,然后从另一个中引用它。这通常不是您想要在 Android 中做事的方式,但有时这样做比序列化和反序列化大量数据只是为了在有权访问的 2 个活动之间传递数据更方便相同的内存 space.