2014-02-28 46 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,...

一般情况下,看看你想要的类被瓜分,然后检查顶为每个领域的课程下载它是否已经可以分类。