Android, Как правильно использовать метод readTypedList в классе Parcelable?

У меня есть две операции, в первой из которых я инициализирую объект ArrayList объекта myObject. Во втором упражнении мне нужно получить этот Arraylist. Я нашел учебное пособие: http://prasanta-paul.blogspot.com/2010/06/androidparcelable-example.html Я реализовал мой класс, понравилось, что это объясняет.

Открытый класс Chapitre реализует Parcelable {

private int numero; private String titre; private String description; private int nbVideo; private ArrayList<Video> listeVideo; public Chapitre(int numero, String titre, String description, ArrayList<Video> listeVideo) { this.numero = numero; this.titre = titre; this.description = description; this.listeVideo = listeVideo; this.nbVideo = listeVideo.size(); } //Getters and Setters ... private Chapitre(Parcel source) { numero = source.readInt(); titre = source.readString(); description = source.readString(); nbVideo = source.readInt(); source.readTypedList(listeVideo, Video.CREATOR); } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeInt(numero); dest.writeString(titre); dest.writeString(description); dest.writeInt(nbVideo); dest.writeTypedList(listeVideo); } public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { public Chapitre createFromParcel(Parcel in) { return new Chapitre(in); } public Chapitre[] newArray(int size) { return new Chapitre[size]; } }; 

}

Public class Video реализует Parcelable {

 private String titre; private int numero; private String url; private String description; private String imageUrl; private Bitmap image; private String duree; /** * * @param nom * @param numero * @param url * @param description */ public Video(String titre, String url, String description) { super(); this.titre = titre; this.url = url; this.description = description; } public Video(int numero, String titre, String url, String description) { super(); this.titre = titre; this.url = url; this.description = description; this.numero = numero; } public Video(String titre,int numero, String url, String description, String imageUrl) { super(); this.titre = titre; this.url = url; this.description = description; this.imageUrl = imageUrl; this.numero = numero; setImage(fetchImage(imageUrl)); } //Getters and Setters ... @Override public int describeContents() { // TODO Auto-generated method stub return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(titre); dest.writeInt(numero); dest.writeString(url); dest.writeString(description); dest.writeString(imageUrl); dest.writeString(duree); } public Video(Parcel source){ /* * Reconstruct from the Parcel */ Log.v("TAG", "ParcelData(Parcel source): time to put back parcel data"); titre = source.readString(); numero = source.readInt(); url = source.readString(); description = source.readString(); imageUrl = source.readString(); duree = source.readString(); } public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { public Video createFromParcel(Parcel in) { return new Video(in); } public Video[] newArray(int size) { return new Video[size]; } }; 

}

Но я получаю nullPointException в строке «source.readTypedList (listeVideo, Video.CREATOR)»; В классе Chapitre.

 07-21 10:07:28.212: ERROR/AndroidRuntime(682): FATAL EXCEPTION: main 07-21 10:07:28.212: ERROR/AndroidRuntime(682): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.genicorp.video.proto/com.genicorp.video.proto.Lecture}: java.lang.NullPointerException 07-21 10:07:28.212: ERROR/AndroidRuntime(682): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1736) 07-21 10:07:28.212: ERROR/AndroidRuntime(682): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1752) 07-21 10:07:28.212: ERROR/AndroidRuntime(682): at android.app.ActivityThread.access$1500(ActivityThread.java:123) 07-21 10:07:28.212: ERROR/AndroidRuntime(682): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:993) 07-21 10:07:28.212: ERROR/AndroidRuntime(682): at android.os.Handler.dispatchMessage(Handler.java:99) 07-21 10:07:28.212: ERROR/AndroidRuntime(682): at android.os.Looper.loop(Looper.java:126) 07-21 10:07:28.212: ERROR/AndroidRuntime(682): at android.app.ActivityThread.main(ActivityThread.java:3997) 07-21 10:07:28.212: ERROR/AndroidRuntime(682): at java.lang.reflect.Method.invokeNative(Native Method) 07-21 10:07:28.212: ERROR/AndroidRuntime(682): at java.lang.reflect.Method.invoke(Method.java:491) 07-21 10:07:28.212: ERROR/AndroidRuntime(682): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841) 07-21 10:07:28.212: ERROR/AndroidRuntime(682): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599) 07-21 10:07:28.212: ERROR/AndroidRuntime(682): at dalvik.system.NativeStart.main(Native Method) 07-21 10:07:28.212: ERROR/AndroidRuntime(682): Caused by: java.lang.NullPointerException 07-21 10:07:28.212: ERROR/AndroidRuntime(682): at android.os.Parcel.readTypedList(Parcel.java:1630) 07-21 10:07:28.212: ERROR/AndroidRuntime(682): at com.genicorp.video.proto.Chapitre.<init>(Chapitre.java:70) 07-21 10:07:28.212: ERROR/AndroidRuntime(682): at com.genicorp.video.proto.Chapitre.<init>(Chapitre.java:65) 07-21 10:07:28.212: ERROR/AndroidRuntime(682): at com.genicorp.video.proto.Chapitre$1.createFromParcel(Chapitre.java:89) 07-21 10:07:28.212: ERROR/AndroidRuntime(682): at com.genicorp.video.proto.Chapitre$1.createFromParcel(Chapitre.java:1) 07-21 10:07:28.212: ERROR/AndroidRuntime(682): at android.os.Parcel.readParcelable(Parcel.java:1981) 07-21 10:07:28.212: ERROR/AndroidRuntime(682): at android.os.Parcel.readValue(Parcel.java:1846) 07-21 10:07:28.212: ERROR/AndroidRuntime(682): at android.os.Parcel.readListInternal(Parcel.java:2092) 07-21 10:07:28.212: ERROR/AndroidRuntime(682): at android.os.Parcel.readArrayList(Parcel.java:1536) 07-21 10:07:28.212: ERROR/AndroidRuntime(682): at android.os.Parcel.readValue(Parcel.java:1867) 07-21 10:07:28.212: ERROR/AndroidRuntime(682): at android.os.Parcel.readMapInternal(Parcel.java:2083) 07-21 10:07:28.212: ERROR/AndroidRuntime(682): at android.os.Bundle.unparcel(Bundle.java:215) 07-21 10:07:28.212: ERROR/AndroidRuntime(682): at android.os.Bundle.getParcelableArrayList(Bundle.java:1151) 07-21 10:07:28.212: ERROR/AndroidRuntime(682): at android.content.Intent.getParcelableArrayListExtra(Intent.java:3634) 07-21 10:07:28.212: ERROR/AndroidRuntime(682): at com.genicorp.video.proto.Lecture.onCreate(Lecture.java:37) 07-21 10:07:28.212: ERROR/AndroidRuntime(682): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1048) 07-21 10:07:28.212: ERROR/AndroidRuntime(682): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1700) 07-21 10:07:28.212: ERROR/AndroidRuntime(682): ... 11 more 

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

заранее спасибо

Надеюсь, вы уже поняли это. Но для всех, кто натыкается на этого. Исключение NullPointerException, которое вы получали, было вызвано тем, что ArrayList никогда не инициализировался.

Это исправит это:

 private Chapitre(){ listVideo = new ArrayList<Video>(); } private Chapitre(Parcel source) { // Call the above constructor this(); numero = source.readInt(); titre = source.readString(); description = source.readString(); nbVideo = source.readInt(); source.readTypedList(listeVideo, Video.CREATOR); } 

Другое решение: используйте createTypedArrayList вместо readTypedList которого требуется ссылка на ненулевой список объектов

Также рассмотрите инициализацию объекта с неизменяемым пустым списком.

private ArrayList<Video> listevideo = Collections.emptyList()

Подробнее здесь: Collections.emptyList () против нового экземпляра