Android - Implementing Parcelable Inner Class

天大地大妈咪最大 提交于 2019-12-04 06:34:58

问题


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


来源:https://stackoverflow.com/questions/35923039/android-implementing-parcelable-inner-class

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!