EDITED TO REFELECT qbix's answer
I have a class which holds data and is used for passing around data between activities. It has a couple of fields, mostly String, but 2 more fields which are of type ArrayList and another ArrayList
When I try to get the data from the intent back, I am getting an exception:
java.lang.RuntimeException: Parcel android.os.Parcel@53614d6c: Unmarshalling unknown type code 7471184 at offset 156
I think that the problem lies somewhere with having an ArrayList which are not correctly handled.
How do I correctly implement Parcelable for ArrayList with custom types?
Here are my classes:
public class OpeningPeriod implements java.io.Serializable{
private int openDay;
private String openTime;
private int closeDay;
private String closeTime;
public OpeningPeriod() {
}
public OpeningPeriod(int closeDay, String closeTime, int openDay, String openTime) {
this.closeDay = closeDay;
this.closeTime = closeTime;
this.openDay = openDay;
this.openTime = openTime;
}
// here come the getters and setters....
}
And my edited Parcelable, which still crashes:
public class AddresseDetails implements Parcelable {
private String placeId;
private String strasse;
private String hausNummer;
private String ort;
private String plz;
private String phone;
private String web;
private ArrayList<String> weekDayText;
private String name;
public AddresseDetails() {
}
public AddresseDetails(Parcel source) {
readFromParcel(source);
}
public AddresseDetails(String hausNummer,
String name,
String ort,
ArrayList<OpeningPeriod> periods,
String phone,
String placeId,
String plz,
String strasse,
String web,
ArrayList<String> weekDayText) {
this.hausNummer = hausNummer;
this.name = name;
this.ort = ort;
this.periods = periods;
this.phone = phone;
this.placeId = placeId;
this.plz = plz;
this.strasse = strasse;
this.web = web;
this.weekDayText = weekDayText;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeString(placeId);
dest.writeString(strasse);
dest.writeString(hausNummer);
dest.writeString(ort);
dest.writeString(plz);
dest.writeString(phone);
dest.writeString(web);
dest.writeStringList(weekDayText);
}
public void readFromParcel(Parcel source){
name = source.readString();
placeId = source.readString();
strasse = source.readString();
hausNummer = source.readString();
ort = source.readString();
plz = source.readString();
phone = source.readString();
web = source.readString();
source.readStringList(weekDayText);
}
public static final Parcelable.Creator<AddresseDetails> CREATOR = new Parcelable.Creator<AddresseDetails>() {
@Override
public AddresseDetails createFromParcel(Parcel source) {
return new AddresseDetails(source);
}
@Override
public AddresseDetails[] newArray(int size) {
return new AddresseDetails[size];
}
};
}
And it crashes in the source.readStringList(weekDayText);
Any suggestions?
Solution:
public class AddresseDetails implements Parcelable {
private String placeId;
private String strasse;
private String hausNummer;
private String ort;
private String plz;
private String phone;
private String web;
private ArrayList<String> weekDayText;
private ArrayList<OpeningPeriod> periods;
private String name;
public AddresseDetails() {
}
public AddresseDetails(Parcel source) {
readFromParcel(source);
}
public AddresseDetails(String hausNummer,
String name,
String ort,
ArrayList<OpeningPeriod> periods,
String phone,
String placeId,
String plz,
String strasse,
String web,
ArrayList<String> weekDayText) {
this.hausNummer = hausNummer;
this.name = name;
this.ort = ort;
this.periods = periods;
this.phone = phone;
this.placeId = placeId;
this.plz = plz;
this.strasse = strasse;
this.web = web;
this.weekDayText = weekDayText;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeString(placeId);
dest.writeString(strasse);
dest.writeString(hausNummer);
dest.writeString(ort);
dest.writeString(plz);
dest.writeString(phone);
dest.writeString(web);
dest.writeStringList(weekDayText);
dest.writeTypedList(periods);
}
public void readFromParcel(Parcel source){
name = source.readString();
placeId = source.readString();
strasse = source.readString();
hausNummer = source.readString();
ort = source.readString();
plz = source.readString();
phone = source.readString();
web = source.readString();
weekDayText = source.createStringArrayList();
periods = source.createTypedArrayList(OpeningPeriod.CREATOR);
}
public static final Parcelable.Creator<AddresseDetails> CREATOR = new Parcelable.Creator<AddresseDetails>() {
@Override
public AddresseDetails createFromParcel(Parcel source) {
return new AddresseDetails(source);
}
@Override
public AddresseDetails[] newArray(int size) {
return new AddresseDetails[size];
}
};
}
public static final Parcelable.Creator<OpeningPeriod> CREATOR = new Parcelable.Creator<OpeningPeriod>() {
@Override
public OpeningPeriod createFromParcel(Parcel source) {
return new OpeningPeriod(source);
}
@Override
public OpeningPeriod[] newArray(int size) {
return new OpeningPeriod[size];
}
};
}