2011-01-16 17 views
33

Ich habe viele parcelable Beispiele bis jetzt gesehen, aber aus irgendeinem Grund kann ich es nicht zur Arbeit bringen, wenn es ein bisschen komplizierter wird. Ich habe ein Movie-Objekt, das Parcelable implementiert. Dieses Buchobjekt enthält einige Eigenschaften, z. B. ArrayLists. Das Ausführen meiner App führt zu einer NullPointerException beim Ausführen der ReadTypedList! Ich bin wirklich Ideen von hierArraylist in parcelable Objekt

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

Die Bewertungsklasse:

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

} 

Ich wäre sehr dankbar, wenn jemand nur mich auf dem richtigen Weg zu bekommen, konnte ich ziemlich viel Zeit verbringen Suche nach diesem!

Dank in adnvance Wesley

Antwort

37

reviews und authors sind beide null. Sie sollten zuerst die ArrayList initialisieren. Eine Möglichkeit, dies zu tun ist, Kette der Konstruktor:

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

DANKE SO MUUUUUCH, verschwendete ich 2 Tage auf diesem :-). – Wesley

14

Von den javadocs für readTypedList:

Lesen Sie in den angegebenen Listenelemente, die einen bestimmten Objekttyp , die mit writeTypedList(List) geschrieben wurden

bei der aktuellen dataPosition(). Die Liste muss vorher über writeTypedList(List) mit dem gleichen Objekttyp geschrieben worden sein.

Sie schrieb sie mit einem einfachen

dest.writeList(reviews); 
+0

Hoppla, ich habe das vor dem Kopieren geändert, indem ich meinen Code hier eingefügt habe. In meinem Projekt habe ich dies wie eingegeben, danke dafür, es zu bemerken! – Wesley

+0

Vielen Dank so viel! Sparte mir Stunden und Stunden – CBaker

+0

Sie haben Recht. Danke vielmals. –

Verwandte Themen