Arraylist in parcelable object
Solution 1
reviews
and authors
are both null. You should first initialize the ArrayList. One way to do this is chain the constructor:
public Movie (Parcel in) {
this();
readFromParcel(in);
}
Solution 2
From the javadocs for readTypedList
:
Read into the given List items containing a particular object type that were written with
writeTypedList(List)
at the current dataPosition()
. The list must have previously been written via writeTypedList(List)
with the same object type.
You wrote them with a plain
dest.writeList(reviews);
Wesley
Updated on October 14, 2020Comments
-
Wesley over 3 years
I have seen many parcelable examples so far, but for some reason I can't get it to work when it gets a bit more complex. I have a Movie object, which implements Parcelable. This book object contains some properties, such as ArrayLists. Running my app results in a NullPointerException when executing the ReadTypedList ! I'm really out of ideas here
public class Movie implements Parcelable{ private int id; private List<Review> reviews private List<String> authors; public Movie () { reviews = new ArrayList<Review>(); authors = new ArrayList<String>(); } public Movie (Parcel in) { readFromParcel(in); } /* getters and setters excluded from code here */ public void writeToParcel(Parcel dest, int flags) { dest.writeInt(id); dest.writeList(reviews); dest.writeStringList(authors); } public static final Parcelable.Creator<Movie> CREATOR = new Parcelable.Creator<Movie>() { public MoviecreateFromParcel(Parcel source) { return new Movie(source); } public Movie[] newArray(int size) { return new Movie[size]; } }; /* * Constructor calls read to create object */ private void readFromParcel(Parcel in) { this.id = in.readInt(); in.readTypedList(reviews, Review.CREATOR); /* NULLPOINTER HERE */ in.readStringList(authors); } }
The Review class:
public class Review implements Parcelable { private int id; private String content; public Review() { } public Review(Parcel in) { readFromParcel(in); } public void writeToParcel(Parcel dest, int flags) { dest.writeInt(id); dest.writeString(content); } public static final Creator<Review> CREATOR = new Creator<Review>() { public Review createFromParcel(Parcel source) { return new Review(source); } public Review[] newArray(int size) { return new Review[size]; } }; private void readFromParcel(Parcel in) { this.id = in.readInt(); this.content = in.readString(); } }
I would be very grateful if someone could just get me on the right track, I have spend quite a bit of time searching for this one !
Thanks in adnvance Wesley