【问题标题】:Read and write an ArrayList of ArrayLists containing Parcelable Objects to pass in an Intent读取和写入包含 Parcelable 对象的 ArrayList 的 ArrayList 以传入 Intent
【发布时间】:2014-05-31 15:56:15
【问题描述】:

我刚刚将项目中的所有可序列化类更改为可打包类。 一切工作正常,除了一个由包含另一个 ArrayList 的 ArrayList 组成的类。我已经调试过了。 编写此 ArrayList 时没有错误。但是我在阅读时遇到了错误。

这是发生错误的类:

public class Timetable implements Parcelable
{
private int actLap = 0;
private ArrayList<Lap> timetable;
private ArrayList<Location> loggedLocations;
private Date startTime; ...
...
public void writeToParcel(Parcel out, int flags)
{
    out.writeInt(actLap);
    out.writeTypedList(timetable); //no error here
    out.writeTypedList(loggedLocations); ...
...
    private Timetable(Parcel in)
{
    actLap          = in.readInt();
    in.readTypedList(timetable, Lap.CREATOR); //error after this line
    in.readTypedList(loggedLocations, Location.CREATOR);
    startTime       = (Date)in.readSerializable();
    bestLap         = in.readParcelable(Lap.class.getClassLoader());
    track           = in.readParcelable(Track.class.getClassLoader());
    description     = in.readString();
}

以下是其他类:

public class Lap implements Parcelable
{   
private ArrayList<Time> sectorTimes = new ArrayList<Time>();
private Time laptime; ...
...
public void writeToParcel(Parcel out, int flags)
{
    out.writeTypedList(sectorTimes);
    out.writeParcelable(laptime,flags);
}

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

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

private Lap(Parcel in)
{
    in.readTypedList(sectorTimes, Time.CREATOR);
    laptime     = in.readParcelable(Time.class.getClassLoader());
}

还有这个类:

public class Time implements Parcelable
{
private long timeLong;
private String timeString;...
...
public void writeToParcel(Parcel out, int flags)
{
    out.writeLong(timeLong);
    out.writeString(timeString);
}

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

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

private Time(Parcel in)
{
    timeLong = in.readLong();
    timeString = in.readString();
}

就像我已经说过的那样,一切正常(还有更多 Parcelable 类,我通过意图传递(包括单个 ArrayList)并保存在文件中)。 那么你们能帮我写和读那个双 ArrayList 吗? 提前致谢

【问题讨论】:

    标签: java android android-intent arraylist parcelable


    【解决方案1】:

    如果您的代码与发布的一样,那么您只是缺少 ArrayLists 的初始化,即

    private Timetable(Parcel in)
    {
        // readTypeList() needs an existing List<> to load.
        timetable = new ArrayList<Lap>();
        loggedLocations = new ArrayList<Location>();
    
        actLap          = in.readInt();
        in.readTypedList(timetable, Lap.CREATOR);
        in.readTypedList(loggedLocations, Location.CREATOR);
        ...
    

    【讨论】:

    • 谢谢!这解决了我的问题。我记得这个方法会创建一个新的 Arraylist。
    • 非常感谢您的分享。太好了!
    猜你喜欢
    • 2020-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-30
    • 2013-03-10
    • 1970-01-01
    • 2017-04-25
    • 2017-08-13
    相关资源
    最近更新 更多