2011-01-16 3 views
33

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

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

} 

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

Спасибо adnvance Уэсли

ответ

37

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

public Movie (Parcel in) { 
    this(); 
    readFromParcel(in); 
} 
+1

СПАСИБО ТАК MUUUUUCH, я потратил 2 дня на этом :-). – Wesley

14

Из Javadocs для readTypedList:

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

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

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

dest.writeList(reviews); 
+0

К сожалению, я изменил это прямо перед копированием, вставив сюда мой код. В моем проекте у меня есть это как напечатанное, спасибо, что заметили его! – Wesley

+0

Большое спасибо! Сэкономил мне часы и часы – CBaker

+0

Вы правы. Большое спасибо. –

 Смежные вопросы

  • Нет связанных вопросов^_^