java - 如何使用 Parcelable 在 Activity 之间传递带有其他对象列表的对象?

标签 java android arraylist parcelable

我有一个名为 Order 的对象,我想在 Activity 之间传递它。目前我正在使用 Parcelable 来执行此操作。

public class Order implements Parcelable {

    private String email;

    private Long timestamp;

    private List<OrderItem> items;

    public Order() { }

    private Order(Parcel in) {
        email = in.readString();
        timestamp = in.readLong();
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(email);
        if (timestamp == null) {
            dest.writeByte((byte) 0);
        } else {
            dest.writeByte((byte) 1);
            dest.writeLong(timestamp);
        }
        dest.writeTypedList(items);
    }

    @Override
    public int describeContents() {
        return 0;
    }

    public static final Creator<Order> CREATOR = new Creator<Order>() {
        @Override
        public Order createFromParcel(Parcel in) {
            return new Order(in);
        }

        @Override
        public Order[] newArray(int size) {
            return new Order[size];
        }
    };
    // Getters
    ...
}

items 字段是实现 Parcelable 接口(interface)的 OrderItem 对象的 List

public class OrderItem implements Parcelable {

    private String orderedClothingId;

    private int quantity;

    public OrderItem() { }

    public OrderItem(String orderedClothingId, int quantity) {
        this.orderedClothingId = orderedClothingId;
        this.quantity = quantity;
    }

    private OrderItem(Parcel in) {
        orderedClothingId = in.readString();
        quantity = in.readInt();
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(orderedClothingId);
        dest.writeInt(quantity);
    }

    @Override
    public int describeContents() {
        return 0;
    }

    public static final Creator<OrderItem> CREATOR = new Creator<OrderItem>() {
        @Override
        public OrderItem createFromParcel(Parcel in) {
            return new OrderItem(in);
        }

        @Override
        public OrderItem[] newArray(int size) {
            return new OrderItem[size];
        }
    };
}

现在,要将名​​为 orderOrder 对象从一个 Activity 传递到另一个 Activity ,我执行以下操作:

Intent intent = new Intent(mContext, ActivityTwo.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra(ORDER_DETAIL_INTENT_EXTRA_KEY, order);            
mContext.startActivity(intent);

ActivityTwo 中,我收集 Order 对象,如下所示:

Bundle data = getIntent().getExtras();
assert data != null;
mOrder = data.getParcelable(ORDER_DETAIL_INTENT_EXTRA_KEY);

但是,当我记录 ActivityTwoOrder 对象中包含的 items 字段时,它是 null。如何在 Activity 之间传递原始非空 Order 对象,而 items 列表不为空?

最佳答案

首先,您错过了使用 dest = in.readTypedList(emptyList, CREATOR); 读回数组

但第二也是更重要的是,您需要写入/读取相同数量的参数,因为您的 writeToParcel 中有一个 if ,因此在读取时您需要相同的参数:

private Order(Parcel in) {
    email = in.readString();
    if(in.readByte() == 1)
        timestamp = in.readLong(); //here to skip just like the writeToParcel
    in.readTypedList(items = new ArrayList<OrderItem>(), OrderItem.CREATOR);
}

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeString(email);
    if (timestamp == null) {
        dest.writeByte((byte) 0);
    } else {
        dest.writeByte((byte) 1);
        dest.writeLong(timestamp);
    }
    dest.writeTypedList(items);
}

关于java - 如何使用 Parcelable 在 Activity 之间传递带有其他对象列表的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47997457/

相关文章:

android - 在关闭应用程序的情况下使用 'react-native-camera'

java - for 循环通过矩形的 ArrayList 检查交集

java - 如何在java中读取文本文件到不同对象类型的ArrayList?

java - ArrayList 内容意外修改

java - java 黑 jack

java - 优雅地关闭嵌入式tomcat 7

android - cordova 要求问题,未安装 android 目标

android - BitmapFactory.decodeByteArray 在 android 中返回 null

java - java中如何从txt文件中获取特定行

java - 我似乎无法获得 android_id