2017-12-27 938 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

謝謝你的建議。你解決了我的一個問題。其餘的處理@馬科斯回答 –

相關問題