web-dev-qa-db-ja.com

Android Parcelable-IAがインターフェイスの場合、ArrayList <IA>の書き込みと読み取り

インターフェイス[〜#〜] ia [〜#〜]とクラス[〜#〜] b [〜#〜][〜# 〜] c [〜#〜]それらを実装します。 BとCはどちらもParcelableも実装しています。

それから私はトリッキーな部分があります:

クラス[〜#〜] d [〜#〜]にはArrayList< IA >。これも必要です。クラスBとCの両方をarraylistに挿入します。それらは同じ構造を共有しますが、"IS-A"関係は適用されません。

Dをあるアクティビティから別のアクティビティに小包として渡す必要があります。

私は書きました(ArrayList<IA>) in.readSerializableですがIOExceptionを取得しました。 IAがインターフェイスではなかった場合、問題は簡単でしたが、これに対する簡単な解決策を見つけることができないようです。

何か案は?

@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);
}
18
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);
}
38
Pedro Bernardo

「Android Parcelable code generator」プラグインをインストールすることをお勧めします。この後、writeToParcel関数を生成できます。これは、Alt+Insertボタンをクリックするだけで区画とクリエータークラスから読み取るコンストラクターです。

0
Axbor Axrorov