2014-02-28 97 views
0

嗨,大家好我試圖包裹嵌套的對象,但它給人的RuntimeException:包裹:不能編組值....嵌套對象包裹不工作

請幫我解決這個問題...

包裹和POJO結構: -

只是在展示POJO變量..

1)RateRule: -

public class RateRule{ 
    private List<Rule> rules = new ArrayList<Rule>(); 
} 

2)規則: -

public class Rule { 
    private String ruleID; 
    private String splOfferId; 
    private String ruleName; 
    private String ruleDescription; 
    private String ruleType; 
    private List<Room> rooms = new ArrayList<Room>(); 
} 

3)房間: -

public class Room { 
     private int id; 
     private String name; 
     private String propertyName; 
     private String roomThumbnailUrl; 
     private String hotelInfo; 
     private float price; 
     private float discountPrice; 
     private String roomTypeId; 
     private String maxOccupancy; 
     private List<String> amenities = new ArrayList<String>(); 
     private List<String> facilities = new ArrayList<String>(); 
     private List<Gallery> gallery = new ArrayList<Gallery>(); 
     private List<String> tvChannels = new ArrayList<String>(); 
     private List<String> attractions = new ArrayList<String>(); 
    } 

----------- Parcelable類來讀取或寫入: -

public class RateRuleParcel implements Parcelable { 
    private RateRule rateRule; 

    public RateRule getRateRule() { 
     return rateRule; 
    } 

    public RateRuleParcel(RateRule rateRule) { 
     super(); 
     this.rateRule = rateRule; 
    } 
    public RateRuleParcel(Parcel in) { 
     rateRule=new RateRule(); 
     ArrayList<Rule> readArrayList = (ArrayList<Rule>)in.readArrayList(Object.class.getClassLoader()); 
     rateRule.setRules(readArrayList); 
    } 
    @Override 
    public int describeContents() { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

    @Override 
    public void writeToParcel(Parcel dest, int flags) { 
     // TODO Auto-generated method stub 
     dest.writeList((ArrayList<Rule>)rateRule.getRules()); 

    } 
    public static final Parcelable.Creator<RateRuleParcel> CREATOR = new Parcelable.Creator<RateRuleParcel>() { 

     @Override 
     public RateRuleParcel createFromParcel(Parcel in) { 
      return new RateRuleParcel(in); 
     } 

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

    }; 

} 

而我試圖在包裹中設置值的類: -

List<Room> roomItem; List<Rule> ruleItem; List<Rule> rateRuleItem; RateRule rateRule = new RateRule(); 

      Rule rule= new Rule(); 
      Room room= new Room(); 
      ruleItem=new ArrayList<Rule>(); 
      roomItem=new ArrayList<Room>(); 
      rateRuleItem=new ArrayList<Rule>(); 
      rule.setRuleID(rateRuleIdArray.get(groupPosition)); 
      rule.setSplOfferId(splOfferId); 
      rule.setRuleName("TESTING"); 
      rule.setRuleDescription("TESTING"); 
      rule.setRuleType(rateRuleTypeArray.get(groupPosition)); 

      room.setId(Integer.parseInt(setId.get(childPosition))); 
      room.setName(setName.get(childPosition).toString()); 
      room.setPropertyName(propertyName); 
      room.setRoomThumbnailUrl("TESTING"); 
      room.setHotelInfo(setHotelInfo.get(childPosition).toString()); 
      room.setPrice(Float.parseFloat(setPrice.get(childPosition).toString())); 
      room.setDiscountPrice(Float.parseFloat(setDiscountPrice.get(childPosition).toString())); 
     // ruleItem.add(rule); 
      roomItem.add(room); 
      rule.setRooms(roomItem); 
      rateRuleItem.add(rule); 
      rateRule.setRules(rateRuleItem); 

回答

2

將分段考慮爲遞歸過程。給定一個實現Parcelable接口的任意對象,包裹進程調用object.writeToParcel()。在這個方法中,你需要包含對象的所有字段,它們可以是本地可分類類型(int,bool,String,List,...),也可以是parcelables。如果它們是可以包裝的,則調用writeToParcel()方法。直到在每個遞歸分支中達到本機可分類類型爲止。

看看你的代碼,dest.writeList((ArrayList<Rule>)rateRule.getRules());你依靠的事實是,有一種方法,似乎寫了一個包裹列表。但是有一個先決條件是列表元素的類型可以再次可以分類,這裏不是這種情況。 你需要讓Rule parcelable,因此你需要Room parcelable,因此你需要Galery parcelable,...

一般情況下,看看你想要的類被瓜分,然後檢查頂爲每個領域的課程下載它是否已經可以分類。