web-dev-qa-db-fra.com

Android Parcelable - Écrire et lire ArrayList <IA> quand IA est une interface

J'ai une interfaceIAet une classeBetCqui les implémentent. B et C implémentent également Parcelable.

Ensuite, j'ai la partie la plus délicate:

La classeDa un ArrayList< IA >. J'ai aussi besoin de cela pour insérer les classes B et C dans la variable arraylist. Ils partagent la même structure mais la relation "IS-A" ne s'applique pas.

Je dois passer D d'une activité à une autre en tant que parcelle. 

J'ai essayé d'écrire (ArrayList<IA>) in.readSerializable mais j'ai unIOException. Je sais que si IA n'était pas une interface, le problème était facile, mais je ne semble pas pouvoir trouver une solution facile pour cela.

Des idées?

@SuppressWarnings("unchecked")
public D (Parcel in) {
    list = new ArrayList<IA>();
    (...)    
    list = (ArrayList<IA>) in.readSerializable 
    }

@SuppressWarnings("rawtypes")
public static final Parcelable.Creator CREATOR =
new Parcelable.Creator() {
    public D createFromParcel(Parcel in) {
        return new D(in);
    }

    public D[] newArray(int size) {
        return new D[size];
    }
};

public int describeContents() {
    return 0;
}

public void writeToParcel(Parcel dest, int flags) {
    (...)
    dest.writeList(list);
}
16
Pedro Bernardo
    @SuppressWarnings("unchecked")
public D (Parcel in) {
    list = new ArrayList<IA>();
    (...)    
    //ERROR -> list = (ArrayList<IA>) in.readSerializable 
    list = in.readArrayList(IA.class.getClassLoader());
}

@SuppressWarnings("rawtypes")
public static final Parcelable.Creator CREATOR =
new Parcelable.Creator() {
    public D createFromParcel(Parcel in) {
        return new D(in);
    }

    public D[] newArray(int size) {
        return new D[size];
    }
};

public int describeContents() {
    return 0;
}

public void writeToParcel(Parcel dest, int flags) {
    (...)
    dest.writeList(list);
}
36
Pedro Bernardo

Je vous recommande d'installer le plug-in "Générateur de code Android Parcelable". Après cela, vous pouvez générer la fonction writeToParcel, constructeur qui lit à partir de la classe de parcelles et de créateurs uniquement en cliquant sur les boutons Alt+Insert.

0
Axbor Axrorov