2011-01-16 6 views
33

J'ai vu beaucoup d'exemples de données parcelables jusqu'à maintenant, mais pour une raison quelconque je ne peux pas le faire fonctionner quand ça 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 génère une exception NullPointerException lors de l'exécution de ReadTypedList! Je suis vraiment d'idées iciArraylist dans un objet 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); 
    } 
} 

La classe d'examen:

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 me mettre sur la bonne voie, j'ai passé un peu de temps chercher celui-ci!

Merci à adnvance Wesley

Répondre

37

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

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

MERCI MUUUUUCH, j'ai perdu 2 jours sur ce :-). – Wesley

14

De la javadoc pour readTypedList:

Lire dans les articles de la liste donnée contenant un type d'objet particulier qui ont été écrites avec writeTypedList(List)

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

Vous avez écrit une

plaine
dest.writeList(reviews); 
+0

Oups, j'ai changé cela juste avant de copier mon code ici. Dans mon projet, j'ai ceci comme dactylographié, merci de le remarquer cependant! – Wesley

+0

Merci beaucoup! M'a sauvé des heures et des heures – CBaker

+0

Vous avez raison. Merci beaucoup. –

Questions connexes