2017-12-27 1169 views
0

我有一个叫做Order的对象,我想在这些活动之间传递。目前我正在使用Parcelable这样做。如何在使用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接口OrderItemList对象。

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对象到另一个我执行以下操作:

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); 

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

回答

1

首先你错过dest = in.readTypedList(emptyList, CREATOR);

但第二也是更重要的,你需要写读阵列回/读取相同ammount的参数,因为你有一个如果你writeToParcel您在阅读时需要的一样:

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); 
} 
+0

当我将它添加到我的类中时,没有方法'createTypedList'。 –

+0

sorr,不记得创建foryou的方法,你可以使用readList和一个空列表(项目将保存值) –

1

从第一眼看起来,您好像在第一个中的可发送的 ORDER_DETAIL_INTENT_EXTRA_KEY以及第二个中的CLOTHING_ADMIN_DETAIL_INTENT_EXTRA_KEY中传递了不同的不同密钥。他们应该是相同的,所以选择哪一个。

您也可以使用getIntent().getParcelableExtra(),而不必使用Bundle

+0

现在有说,'items'列表为空 –

+0

1.是你abl基因问题通过数据传递?让我们检查你的新错误 – martinomburajr

+0

谢谢你的建议。你解决了我的一个问题。其余的处理@马科斯回答 –

相关问题