Существует интерфейс DrawingElement
(расширяющий Parcelable
) с несколькими реализациями. В другом классе есть поле List<DrawingElement> elements
, которое реализует Parcelable
. Таким образом, List должен быть записан в Parcel, но метод чтения Parcelable ArrayList требует конкретного класса для ссылки на конкретную реализацию Creator, а это не работает: in.createTypedArrayList(DrawingElement.CREATOR)
.
public interface DrawingElement extends Parcelable {
}
public class FirstDrawingElementImpl implements DrawingElement {
@Override
public void writeToParcel(Parcel dest, int flags) {
// done easily.
}
}
public class SecondDrawingElementImpl implements DrawingElement {
@Override
public void writeToParcel(Parcel dest, int flags) {
// done easily.
}
}
public class DrawingElementsContainer implements Parcelable {
private List<DrawingElement> elements;
@Override
public void writeToParcel(Parcel dest, int flags) {
// TODO:
}
}
Какие-либо предложения?
ОБНОВЛЕНИЕ:
Если бы мне пришлось использовать предложение @pskink, мне пришлось бы делать странные приведения, например:
protected Drawing(Parcel in) {
DrawingElement[] parcelables = (DrawingElement[]) in.readParcelableArray(DrawingElement.class.getClassLoader());
elements = new ArrayList<>(Arrays.asList(parcelables));
}
public void writeToParcel(Parcel dest, int flags) {
dest.writeParcelableArray(elements.toArray(new Parcelable[elements.size()]), flags);
}
dest.writeList(elements)
— очевидное решение, но я запутался, передав интерфейсный загрузчик классов.
Parcelable
? - person pskink   schedule 27.01.2017Parcelable
, а не какой-то абстрактный интерфейс, затем используйтеwriteParcelableArray
/readParcelableArray
- person pskink   schedule 29.01.2017