comment implémenter correctement Parcelable avec une ArrayList<Parcelable>?
Je vais avoir du mal à faire ma classe Parcelable
. Le problème est que je suis en train d'écrire à la parcelle, un membre de la classe qui est un ArrayList<Parcelable>
objet. Le ArrayList
est Serializable
, et les objets (ZigBeeDev
) dans la liste sont Parcelable
.
Voici le code correspondant:
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];
}
};
//...
}
J'ai marqué deux spots "//de l'aide ici" pour comprendre comment écrire correctement à la parcelle, et la façon de le reconstruire. Si ZigBeeDev
est Parcelable
(testé correctement), comment puis-je faire cela correctement?
Vous devez vous connecter pour publier un commentaire.
Vous presque obtenu !
Vous avez juste besoin de faire :
C'est tout!
Pour votre liste de nombre Entier, vous pouvez aussi faire :
Il devrait fonctionner.
ZigBeeDev.Creator
devrait êtreZigBeeDev.CREATOR
. J'ai une erreur à chaque fois jusqu'à ce que j'ai réalisé qu'il y avait deux créateurs que je pourrais utiliser dans mon propre projet.cannot convert from void to ArrayList<Integer>
Hashtable
qui utilise les primitives de type (y comprisString
) pour l'un de ses clés ou des valeurs.Dans mon cas
in.readTypedList(_devices, ZigBeeDev.CREATOR);
m'a donné unNullPointerException
sur_devices
. J'ai donc utilisé ce:in.readTypedList()
vous avez besoin pour créer un new ArrayList() en premier et ensuite passer que pour lain.readTypedList(yourNewArrayList, YourObj.CREATOR)
sinon il ne sera d'essayer de mettre les données dans un null liste.Vous devez utiliser writeList(Liste l) pour votre liste d'entiers et writeTypedList(Liste val) pour la liste de ZigBeeDevices
Dans le constructeur, vous devez utiliser
Et dans "writeToParcel" utilisation
Un peu en retard mais j'ai aussi eu ce problème. Après une longue perte de temps je suis tombé sur le parcelabler.com site web qui crée automatiquement des colis pour vous.
Il m'a permis de créer un imbriquée colis avec une liste de tableau à l'intérieur très facilement, et m'a sauvé beaucoup de temps.
Fondamentalement la façon dont le site fonctionne est que vous entrez votre objet avec la liste de tableaux et ajoute automatiquement les méthodes nécessaires pour rendre parcelable (lecture de la parcelle, écrire à la parcelle, décrivez le contenu, et de colis Créateur sont tous générés automatiquement). Ceci est particulièrement utile lors de la création de complexes de parcelles, telle que la question ici demande, qui inclurent des colis, des tableaux et des listes.
EDIT: Aussi IntelliJ IDEA et Android Studio plugins pour ce qui faire quelque chose de similaire pour le site web indiqué:
Ces plugins générer Android Parcelable code standard basée sur les champs de la classe.