studio que pasar parcelabler objetos example entre actividades java android arraylist nullpointerexception parcelable

java - que - Android, ¿Cómo se usa el método readTypedList correctamente en una clase Parcelable?



pasar objetos entre actividades android (4)

Tengo dos actividades, en la primera, instancia una ArrayList de Object myObject. En la segunda actividad, necesito obtener este Arraylist. Encontré un tutorial: http://prasanta-paul.blogspot.com/2010/06/android-parcelable-example.html Implementé mi clase y me gustó su explicación.

clase pública Chapitre implementa 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]; } };

}

video de clase pública implementa 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]; } };

}

Pero obtengo nullPointException en la línea "source.readTypedList (listeVideo, Video.CREATOR);" en la clase 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

Ya perdí 1 día en esto, así que si alguien puede ayudarme, sería genial,

Gracias por adelantado


¡También tenga en cuenta que debe leer y escribir el atributo de objeto parcelable en el mismo orden! También 2 horas porque el desemparejamiento no estaba en el mismo orden de clasificación.


Con suerte, ya te has dado cuenta de esto. Pero para cualquier otra persona que tropiece con este. La NullPointerException que recibía fue causada por ArrayList que nunca se inicializó.

Esto lo arreglaría:

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


Otra solución: use createTypedArrayList lugar de readTypedList que requiere una referencia de objeto List no nulo