简体   繁体   English

如何在可拆分的Android Studio Java中传递具有抽象类类型作为参数的类

[英]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. 我试图将此类作为可包裹的物品在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 . 问题是Item是抽象的,而itemList = in.creatTypedArrayList(Item.CREATOR),因为Item没有CREATOR。 Only its subclasses have this implementation. 只有其子类具有此实现。

Item.java 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. 当我打电话给多余的东西时,我能够将List作为可打包数组切成小块。 But when I try to do so for outfit it gives error . 但是,当我尝试这样做时,会出现错误。 Is there any way to pass Outfit as a parcelable? 有什么办法可以将服装作为包裹传递出去吗?

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM