calveeen
calveeen

Reputation: 651

How to pass a class with an abstract class type as parameter in parcelable android studio java

I am trying to pass this class as a parcelable in android.

public class Outfit implements Parcelable {

    private List<Item> itemList;
    private String mName;
    private String mImageUrl;

    public Outfit() {}

    public Outfit(String mName, String mImageUrl) {
        this.mName = mName;
        this.mImageUrl = mImageUrl;

    }

    protected Outfit(Parcel in) {
        itemList = in.createTypedArrayList(Item.CREATOR);
        mName = in.readString();
        mImageUrl = in.readString();
    }

    public static final Creator<Outfit> CREATOR = new Creator<Outfit>() {
        @Override
        public Outfit createFromParcel(Parcel in) {
            return new Outfit(in);
        }

        @Override
        public Outfit[] newArray(int size) {
            return new Outfit[size];
        }
    };

    public String getmName() {
        return mName;
    }

    public String getmImageUrl() {
        return mImageUrl;
    }

    @Override
    public String toString() {
        return mName;
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel parcel, int i) {
        parcel.writeTypedList(itemList);
        parcel.writeString(mName);
        parcel.writeString(mImageUrl);
    }
}

the problem is that Item is abstract and itemList = in.creatTypedArrayList(Item.CREATOR) because Item does not have a CREATOR . Only its subclasses have this implementation.

Item.java

public abstract class Item implements Parcelable {

    private String mName;

    private String mColor;

    private String mImageUrl;

    private List<TagHolder> tags = new ArrayList<>();

    private String mKey;

    public Item(){

    }

    public Item(String mName, String mColor, String mImageUrl) {
        this.mName = mName;
        this.mColor = mColor;
        this.mImageUrl = mImageUrl;
    }

    protected Item(Parcel in) {
        mName = in.readString();
        mColor = in.readString();
        mImageUrl = in.readString();
        tags = in.createTypedArrayList(TagHolder.CREATOR);
        mKey = in.readString();
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(mName);
        dest.writeString(mColor);
        dest.writeString(mImageUrl);
        dest.writeTypedList(tags);
        dest.writeString(mKey);
    }

    @Override
    public int describeContents() {
        return 0;
    }


    public void setmName(String mName) {
        this.mName = mName;
    }

    public void setmImageUrl(String mImageUrl) {
        this.mImageUrl = mImageUrl;
    }

    public List<TagHolder> getTags() {
        return tags;
    }

    public String getmColor() {
        return mColor;
    }

    public String getmImageUrl() {
        return mImageUrl;
    }

    public void setmColor(String mColor) {
        this.mColor = mColor;
    }

    public String getmName() {
        return mName;
    }

    public void setTags(List<TagHolder> tags) {
        this.tags = tags;
    }

    @Exclude // dont need this in our firebase database
    public String getKey() {
        return mKey;
    }

    @Exclude
    public void setMkey(String key) {
        mKey = key;
    }

    public abstract String getCategory();
}

I am able to parce a List as a parcelable array when I call put extra. But when I try to do so for outfit it gives error . Is there any way to pass Outfit as a parcelable?

Upvotes: 1

Views: 554

Answers (1)

Hamlet Leon
Hamlet Leon

Reputation: 467

Do you try using another method for the list?

@Override
public void writeToParcel(Parcel parcel, int i) {
    parcel.writeList(itemList);
    parcel.writeString(mName);
    parcel.writeString(mImageUrl);
}

protected Outfit(Parcel in) {
    in.readList(itemList, Item.class.getClassLoader());
    mName = in.readString();
    mImageUrl = in.readString();
}

Upvotes: 2

Related Questions