J'essaie de faire un ArrayList
Parcelable
afin de passer à une activité une liste d'objets personnalisés. Je commence à écrire une myObjectList
classe qui étend ArrayList<myObject>
et implémente Parcelable
.
Certains attributs de MyObject
sont boolean
mais Parcel
n'ont aucune méthode read/writeBoolean
.
Quelle est la meilleure façon de gérer cela?
android
parcelable
grogner
la source
la source
Serializable
interface pour la communication inter-activités. C'est lent.Réponses:
Voici comment je le ferais ...
writeToParcel:
readFromParcel:
la source
/** * Write a byte value into the parcel at the current dataPosition(), * growing dataCapacity() if needed. */ public final void writeByte(byte val) { writeInt(val); }
writeByte
, mais écrit en fait un int.Vous pouvez également utiliser la méthode writeValue . À mon avis, c'est la solution la plus simple.
Ensuite, vous pouvez facilement le récupérer avec un simple casting pour
Boolean
:Sous le capot, Android Framework le traitera comme un entier:
la source
vous déclarez comme ça
écrire
lis
Le type booléen doit être converti en quelque chose que Parcel prend en charge et nous pouvons donc le convertir en int.
la source
AndroidStudio (en utilisant 2.3 atm), après avoir implémenté Parcelable sur votre classe, vous pouvez simplement maintenir le pointeur de votre souris sur le nom de votre classe et il vous demande d'ajouter l'implémentation parcelable:
À partir des quatre champs, il génère les éléments suivants:
la source
Je les ai normalement dans un tableau et appeler
writeBooleanArray
etreadBooleanArray
S'il s'agit d'un seul booléen que vous devez emballer, vous pouvez le faire:
la source
la source
Allez simplement dans Fichier-> Paramètres-> Plugins-> Parcourir le référentiel et recherchez parcelable .Voir l'image
Il créera automatiquement Parcelable.
Et il y a aussi un webiste pour faire ça. http://www.parcelabler.com/
la source
Implémentation courte et simple dans Kotlin , avec support nullable:
Ajouter des méthodes à Parcel
Et utilisez-le:
la source
Vous pouvez regrouper vos valeurs booléennes dans un octet en utilisant le masquage et le décalage. Ce serait la façon la plus efficace de le faire et c'est probablement ce qu'ils attendraient de vous.
la source
writeByte()
méthode de Parcel appelle directementwriteInt()
Il est difficile d'identifier la vraie question ici. Je suppose que c'est la façon de traiter les booléens lors de la mise en œuvre de l'
Parcelable
interface.Vous devrez soit stocker la valeur sous forme de chaîne, soit sous forme d'octet. Si vous optez pour une chaîne, vous devrez utiliser la méthode statique de la
String
classe appeléevalueOf()
pour analyser la valeur booléenne. Ce n'est pas aussi efficace que de l'enregistrer dans un octet difficile.Si vous optez pour un octet, vous devrez implémenter vous-même une logique de conversion.
Lorsque vous démasquez l'
Parcel
objet, vous devez vous occuper de la conversion vers le type d'origine.la source
writeByte()
méthode Parcel appelle directementwriteInt()
. La logique de conversion est trop verbeuse.writeInt(boolean ? 1 : 0)
boolean = readInt() != 0
Cette question a déjà été parfaitement répondue par d'autres personnes, si vous voulez le faire vous-même.
Si vous préférez encapsuler ou masquer la plupart du code de parcellaire de bas niveau, vous pouvez envisager d'utiliser une partie du code que j'ai écrit il y a quelque temps pour simplifier la gestion des parcellaires.
Écrire sur un colis est aussi simple que:
où couleur est une énumération et isDriving est un booléen, par exemple.
La lecture d'un colis n'est pas non plus beaucoup plus difficile:
Jetez un œil au "ParceldroidExample" que j'ai ajouté au projet.
Enfin, il conserve également l'initialiseur CREATOR court:
la source
.class.getClassLoader()
.Il existe de nombreux exemples dans les sources Android (AOSP). Par exemple, la
PackageInfo
classe a un membre booléenrequiredForAllUsers
et elle est sérialisée comme suit:la source