Android - Implementing Parcelable Inner Class

2020-05-07 04:36发布

问题:

I know how to implement a simple Parcelable class with public variables but the class below is somewhat more complex. How can I implement the Parcelable interface given that this class has an inner class and ListEntity? I'm not even sure how to begin. Any detailed information on how to do this would be greatly appreciated.

import android.os.Parcel;
import android.os.Parcelable;

import java.util.List;

public class ResponsePlaceSearch implements Parcelable {

    // *** Parcelable methods are shown below (Begin) ***

    protected ResponsePlaceSearch(Parcel in) {
    }

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

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

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

    @Override
    public void writeToParcel(Parcel dest, int flags) {

    }

    // *** (End) ***


    private List<ListEntity> list;

    public void setList(List<ListEntity> list) {
        this.list = list;
    }

    public List<ListEntity> getList() {
        return list;
    }

    public static class ListEntity {
        private int id;
        private String name;

        private CoordEntity coord;
        private int dt;

        private WindEntity wind;

        private SysEntity sys;

        public void setId(int id) {
            this.id = id;
        }

        public void setName(String name) {
            this.name = name;
        }

        public void setCoord(CoordEntity coord) {
            this.coord = coord;
        }

        public void setDt(int dt) {
            this.dt = dt;
        }

        public void setWind(WindEntity wind) {
            this.wind = wind;
        }

        public void setSys(SysEntity sys) {
            this.sys = sys;
        }

        public int getId() {
            return id;
        }

        public String getName() {
            return name;
        }

        public CoordEntity getCoord() {
            return coord;
        }

        public int getDt() {
            return dt;
        }

        public WindEntity getWind() {
            return wind;
        }

        public SysEntity getSys() {
            return sys;
        }

        public static class CoordEntity {
            private double lon;
            private double lat;

            public void setLon(double lon) {
                this.lon = lon;
            }

            public void setLat(double lat) {
                this.lat = lat;
            }

            public double getLon() {
                return lon;
            }

            public double getLat() {
                return lat;
            }
        }

        public static class WindEntity {
            private double speed;
            private double deg;

            public void setSpeed(double speed) {
                this.speed = speed;
            }

            public void setDeg(double deg) {
                this.deg = deg;
            }

            public double getSpeed() {
                return speed;
            }

            public double getDeg() {
                return deg;
            }
        }

        public static class SysEntity {
            private String country;

            public void setCountry(String country) {
                this.country = country;
            }

            public String getCountry() {
                return country;
            }
        }
    }
}

回答1:

You simply need to implement the Parcelable interface for each inner class (ListEntity, SysEntity, ...), so all classes and classes they contain implement Parcelable.

Then you add the class to the parcel using

public final void writeParcelable (Parcelable p, int parcelableFlags)

where p is the instance of your inner class.

Edit: here's an example of how to parcel an inner class:

public class SampleParcelable implements Parcelable {
    public static class InnerClass implements Parcelable {
        private String mInnerString;
        private long mInnerLong;

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

        @Override
        public void writeToParcel(Parcel dest, int flags) {
            dest.writeString(mInnerString);
            dest.writeLong(mInnerLong);
        }

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

            public InnerClass[] newArray(int size) {
                return new InnerClass[size];
            }
        };

        private InnerClass(Parcel in) {
            mInnerString = in.readString();
            mInnerLong = in.readLong();
        }
    }

    private String mString;
    private long mLong;
    private InnerClass mInnerClass;

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

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(mString);
        dest.writeLong(mLong);
        dest.writeParcelable(mInnerClass, flags);
    }

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

        public SampleParcelable[] newArray(int size) {
            return new SampleParcelable[size];
        }
    };

    private SampleParcelable(Parcel in) {
        mString = in.readString();
        mLong = in.readLong();
        mInnerClass = in.readParcelable(InnerClass.class.getClassLoader());
    }
}