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:
- Ventajas de Parcelable sobre JSON
- ¿Guardando la clase en el archivo?
- Parcelable encontrado IOException writing serializable object getactivity ()
- ¿Cuál es la mejor manera de serializar una imagen (compatible con Swing) de Java a Android?
- Cómo pasar el objeto serializado gson a Intent en android?
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?
- Serialización Gson dependiendo del valor del campo
- JSONObject no serializable?
- Java.io.NotSerializableException al escribir objeto Serializable a un almacenamiento externo?
- Comunicaciones de Dalvik a Java SE
- ¿Cómo puedo serializar un RealmObject a JSON en Realm for Java?
- ¿Puedo utilizar serialización con ofuscación?
- Serializar objeto para enviar dentro de Intent en Android
- Cómo serializar / deserializar arrayList (Object)
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);