2011-08-05 26 views
3

我正在嘗試使用Parcelable接口使對象包含List可以使用Parcelable接口進行分配。我無法再讀取Parcel對象。實現包含List的Parcelable接口的對象會拋出一個NullPointerException

任何人都可以指向正確的方向嗎?我在這裏錯過了什麼?

MyParcelable對象:

public class MyParcelable implements Parcelable { 

    private int myInt = 0; 
    private List<MyListClass> arrList; 

    public List<MyListClass> getArrList() { 
     return arrList; 
    } 

    public void setArrList(List<MyListClass> arrList) { 
     this.arrList = arrList; 
    } 

    public int getMyInt() { 
     return myInt; 
    } 

    public void setMyInt(int myInt) { 
     this.myInt = myInt; 
    } 

    MyParcelable() { 
     // initialization 
     arrList = new ArrayList<MyListClass>(); 
    } 

    public MyParcelable(Parcel in) { 
     myInt = in.readInt(); 
     in.readTypedList(arrList, MyListClass.CREATOR); 
    } 

    @Override 
    public int describeContents() { 
     return 0; 
    } 

    @Override 
    public void writeToParcel(Parcel outParcel, int flags) { 
     outParcel.writeInt(myInt); 
     outParcel.writeTypedList(arrList); 
    } 

    public static final Parcelable.Creator<MyParcelable> CREATOR = 
      new Parcelable.Creator<MyParcelable>() { 

     @Override 
     public MyParcelable createFromParcel(Parcel in) { 
      return new MyParcelable(in); 
     } 

     @Override 
     public MyParcelable[] newArray(int size) { 
      return new MyParcelable[size]; 
     } 
    }; 
} 

MyListClass對象:

public class MyListClass implements Parcelable{ 

    private int test; 

    public MyListClass() 
    {} 

    public MyListClass(Parcel read){ 
     test = read.readInt(); 
    } 

    public int getTest() { 
     return test; 
    } 

    public void setTest(int test) { 
     this.test = test; 
    } 

    public static final Parcelable.Creator<MyListClass> CREATOR = 
     new Parcelable.Creator<MyListClass>() { 

      @Override 
      public MyListClass createFromParcel(Parcel source) { 
       return new MyListClass(source); 
      } 

      @Override 
      public MyListClass[] newArray(int size) { 
       return new MyListClass[size]; 
      } 
     }; 

    @Override 
    public int describeContents() { 
     return 0; 
    } 

    @Override 
    public void writeToParcel(Parcel arg0, int arg1) { 
     arg0.writeInt(test); 
    } 
} 
+2

爲什麼你的MyListClass ** **不Parcelable尚未初始化。 – Samuel

+0

@Sam Quest我在寫和閱讀列表問題。 –

+0

根據我的理解,當發生parcel時,必須將它分解爲原始數據類型(int,string ...),如果MyListClass不可parcelable,這可能是一個問題,您已經爲對象列表實現了parcelable ,現在也必須逐個序列化對象。 – Samuel

回答

16

的問題是,當你的MyParcelable對象的創建者調用私有構造函數,從中重建對象的ParcelArrayList仍未初始化,因此null

現在的方法調用readTypedList()試圖將Parcel S含量寫入ArrayList您指定會拋出一個NullPointerEception,因爲它尚未初始化。

解決方法是在調用該方法之前初始化ArrayList

public MyParcelable(Parcel in) { 
    myInt = in.readInt(); 
    arrList = new ArrayList<MyListClass>(); 
    in.readTypedList(arrList, MyListClass.CREATOR); 
} 
+0

那幫了。謝謝。 :) –

+0

「問題是,當MyParcelable對象的創建者調用從中重建對象的包的私有構造函數時,ArrayList仍然未初始化,因此爲null。」完全忘了這部分,gj。 – Ayoub

1

in.readTypedList(arrList, MyListClass.CREATOR);

arrList在這一點上,當你調用return new MyParcelable(in);

+0

謝謝你哪裏沒有錯。 :) –

相關問題