문제

Hi Guys i am trying to parcel nested object but it gives RuntimeException: Parcel: unable to marshal value....

please help me to solve this problem...

Parcel and pojo structure :-

Just showing the variables in pojo..

1) RateRule :-

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

2) Rule :-

 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) Room:-

    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 class to read or write :-

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];
        }

    };

}

And the class where i am trying to set vales in parcel:--

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);
도움이 되었습니까?

해결책

Think of parceling as a recursive process. Given an arbitrary object that implements the Parcelable interface, the parcel process calls object.writeToParcel(). In this method again, you need to parcel all fields of object, where they are either natively parcelable types (int, bool, String, List, ...) or again parcelables. If they are parcelables, the writeToParcel() method is called on them. You do this until you reach natively parcelable types in every recursion branch.

Having a look at your code, with dest.writeList((ArrayList<Rule>)rateRule.getRules()); you rely on the fact that there is a method that seems to wrote a list to a parcel. But there is the precondition that the type of the list elements is again parcelable, which is not the case here. You need to make Rule parcelable, thus you need to make Room parcelable, thus you need to make Galery parcelable, ...

In general, have a look at the class you want to be parceled and then check top-down for each field's class whether it is already parcelable.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top