Массив в делимом объекте

До сих пор я видел много примеров, но по какой-то причине я не могу заставить его работать, когда он становится немного сложнее. У меня есть объект Movie, который реализует Parcelable. Этот объект книги содержит некоторые свойства, такие как ArrayLists. Запуск моего приложения приводит к NullPointerException при выполнении ReadTypedList! У меня действительно нет идей здесь

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

Класс обзора:

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

}

Я был бы очень признателен, если бы кто-то мог просто направить меня на правильный путь, я потратил довольно много времени на поиски этого!

Заранее спасибо Уэсли


person Wesley    schedule 16.01.2011    source источник


Ответы (2)


reviews и authors оба равны нулю. Сначала вы должны инициализировать ArrayList. Один из способов сделать это — связать конструктор:

public Movie (Parcel in) {
   this();
   readFromParcel(in); 
}
person Matthew Flaschen    schedule 16.01.2011
comment
ОГРОМНОЕ СПАСИБО, я потратил на это 2 дня :-). - person Wesley; 16.01.2011

Из javadocs для readTypedList:

Читать в данные элементы списка, содержащие определенный тип объекта, которые были записаны с помощью writeTypedList(List)

в настоящее время dataPosition(). Список должен быть предварительно записан через writeTypedList(List) с тем же типом объекта.

Вы написали их с простой

dest.writeList(reviews);
person NickT    schedule 16.01.2011
comment
К сожалению, я изменил это прямо перед тем, как скопировать сюда свой код. В моем проекте это напечатано, спасибо, что заметили! - person Wesley; 16.01.2011
comment
Большое спасибо! Сэкономил мне часы и часы - person CBaker; 29.12.2012
comment
@NickT: dest.writeList используется для списка таких типов, как string, int, boolean и т. д. ?? - person Code_Life; 12.09.2013
comment
Лучший ответ, Позиция имеет значение в объектах записи и чтения, я потратил впустую много своего времени. Но твой ответ спас мой день. Спасибо, бро. - person Mubashar Javed; 13.07.2017