web-dev-qa-db-fra.com

Arraylist dans un objet parcellable

J'ai vu de nombreux exemples parcellables jusqu'à présent, mais pour une raison quelconque, je ne peux pas le faire fonctionner quand cela devient un peu plus complexe. J'ai un objet Movie, qui implémente Parcelable. Cet objet livre contient certaines propriétés, telles que ArrayLists. L'exécution de mon application entraîne une exception NullPointerException lors de l'exécution de ReadTypedList! Je suis vraiment à court d'idées ici

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

La classe Review:

    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();
   }

}

Je serais très reconnaissant si quelqu'un pouvait simplement me mettre sur la bonne voie, j'ai passé pas mal de temps à chercher celui-ci!

Merci d'avance Wesley

34
Wesley

reviews et authors sont tous deux nuls. Vous devez d'abord initialiser ArrayList. Une façon de faire est de chaîner le constructeur:

public Movie (Parcel in) {
   this();
   readFromParcel(in); 
}
38
Matthew Flaschen

À partir des javadocs pour readTypedList:

Lire dans la liste donnée des éléments contenant un type d'objet particulier qui ont été écrits avec writeTypedList(List)

à la dataPosition() actuelle. La liste doit avoir été préalablement écrite via writeTypedList(List) avec le même type d'objet.

Vous les avez écrits avec un simple

dest.writeList(reviews);
15
NickT