Cómo implementar correctamente Parcelable con un ArrayList <Parcelable>?

Estoy teniendo problemas para hacer mi clase Parcelable . El problema es que estoy tratando de escribir en el paquete un miembro de la clase que es un objeto ArrayList<Parcelable> . El ArrayList es Serializable , y los objetos ( ZigBeeDev ) en la lista son Parcelable .

Aquí está el código relevante:

 package com.gnychis.coexisyst; import java.util.ArrayList; import java.util.Iterator; import android.os.Parcel; import android.os.Parcelable; public class ZigBeeNetwork implements Parcelable { public String _mac; // the source address (of the coordinator?) public String _pan; // the network address public int _band; // the channel ArrayList<Integer> _lqis; // link quality indicators (to all devices?) ArrayList<ZigBeeDev> _devices; // the devices in the network public void writeToParcel(Parcel out, int flags) { out.writeString(_mac); out.writeString(_pan); out.writeInt(_band); out.writeSerializable(_lqis); out.writeParcelable(_devices, 0); // help here } private ZigBeeNetwork(Parcel in) { _mac = in.readString(); _pan = in.readString(); _band = in.readInt(); _lqis = (ArrayList<Integer>) in.readSerializable(); _devices = in.readParcelable(ZigBeeDev.class.getClassLoader()); // help here } public int describeContents() { return this.hashCode(); } public static final Parcelable.Creator<ZigBeeNetwork> CREATOR = new Parcelable.Creator<ZigBeeNetwork>() { public ZigBeeNetwork createFromParcel(Parcel in) { return new ZigBeeNetwork(in); } public ZigBeeNetwork[] newArray(int size) { return new ZigBeeNetwork[size]; } }; //... } 

He marcado dos puntos "// ayuda aquí" para entender cómo escribir correctamente en el paquete y cómo reconstruirlo. Si ZigBeeDev es Parcelable (correctamente probado), ¿cómo hago esto correctamente?

Casi lo tienes!

Sólo tienes que hacer:

 public void writeToParcel(Parcel out, int flags) { out.writeString(_mac); out.writeString(_pan); out.writeInt(_band); out.writeSerializable(_lqis); out.writeTypedList(_devices); } private ZigBeeNetwork(Parcel in) { _mac = in.readString(); _pan = in.readString(); _band = in.readInt(); _lqis = (ArrayList<Integer>) in.readSerializable(); in.readTypedList(_devices, ZigBeeDev.CREATOR); } 

¡Eso es todo!

Para su lista de entero, también puede hacer:

 out.writeList(_lqis); _lqis = new ArrayList<>(); in.readList(_lqis Integer.class.getClassLoader()); 

Deberia de funcionar.

En mi caso in.readTypedList(_devices, ZigBeeDev.CREATOR); Me dio una NullPointerException en _devices . Así que usé esto:

 _devices = in.createTypedArrayList(ZigBeeDev.CREATOR); 

Debe utilizar writeList (Lista l) para su lista de enteros y writeTypedList (List val) para la lista de ZigBeeDevices

En constructor debe utilizar

 _lqis = in.createTypedArrayList(ZigBeeDev.CREATOR); 

Y en el uso de "writeToParcel"

 out.writeTypedList(_lqis); 
  • Escribir XML en Android
  • Gson serializar a LinkedTreeMap en lugar de mi Entidad
  • Leer / escribir un objeto en un archivo
  • Orden Android Parcelable
  • Archivo de serialización en Android
  • Cómo serializar doble valor utilizando kSOAP en Android
  • Java lanza NotSerializableException después de agregar su propia interfaz
  • Problemas de serialización java con JVM diferentes
  • Serialización de Java - deserialización de Android
  • Proguard mantener a los miembros de la clase
  • Restlet en Android - Problemas con la serialización
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.