Подтвердить что ты не робот

Android Parcelable - запись и чтение ArrayList <IA>, когда 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);
}
4b9b3361

Ответ 1

    @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);
}

Ответ 2

Я рекомендую вам установить плагин "Android Parcelable code generator". После этого вы можете сгенерировать функцию writeToParcel, конструктор, который читает из класса отправления и создания, только нажав кнопки Alt+Insert.