Отправить разделяемый объект другому действию

#android #arraylist #parcelable

#Android #arraylist #разделяемый

Вопрос:

Я получил 3 класса. Сериалы, сезоны и эпизоды. Класс Series получил список объектов Season, а класс Season — список объектов Episode.

Я хочу отправить объект серии в другое действие, подобное этому.

 Intent intent = new Intent(context, OtherActivity.class);
intent.putExtra("series", (Parcelable)seriesObject);
 

Но я получаю исключение NullPointerException.

Вот классы, которые реализуют Parcelable.

Класс серии:

 public class Series implements Parcelable {

private int seasonCount;
public ArrayList<Season>seasons;
private String seriesName;
private int lastSeenSeason = 0;
private int lastSeenEpisode = 0;

public int describeContents() {
    return 0;
}

public void writeToParcel(Parcel dest, int flags) {
    dest.writeInt(seasonCount);
    dest.writeTypedList(seasons);
    dest.writeString(seriesName);
    dest.writeInt(lastSeenSeason);
    dest.writeInt(lastSeenEpisode);
}

private Series(Parcel in){
    seasonCount = in.readInt();
    in.readTypedList(seasons, Season.CREATOR);
    seriesName = in.readString();
    lastSeenSeason = in.readInt();
    lastSeenEpisode = in.readInt();
}

public static final Parcelable.Creator<Series> CREATOR = new Parcelable.Creator<Series>() {
    public Series createFromParcel(Parcel in) {
        return new Series(in);
    }
    public Series[] newArray(int size) {
        return new Series[size];
    }
};
 

Класс сезона:

 public class Season implements Parcelable{

private int seasonNo;
private int episodeCount;
public ArrayList<Episode> episodes;


public int describeContents() {
    return 0;
}

public void writeToParcel(Parcel dest, int flags) {
    dest.writeInt(seasonNo);
    dest.writeInt(episodeCount);
    dest.writeTypedList(episodes);
}

private Season(Parcel in){
    this.seasonNo = in.readInt();
    episodeCount = in.readInt();
    in.readTypedList(episodes, Episode.CREATOR);
}

public static final Parcelable.Creator<Season> CREATOR = new Parcelable.Creator<Season>() {
    public Season createFromParcel(Parcel in) {
        return new Season(in);
    }
    public Season[] newArray(int size) {
        return new Season[size];
    }
};
 

и класс Episode:

 public class Episode implements Parcelable{

private int episodeNo;
private boolean episodeSeen;


public int describeContents() {
    return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeInt(episodeNo);
    dest.writeByte((byte) (episodeSeen ? 1 : 0));
}

private Episode(Parcel in){
    episodeNo = in.readInt();
    episodeSeen = in.readByte() != 0;
}


public static final Parcelable.Creator<Episode> CREATOR = new Parcelable.Creator<Episode>() {
    public Episode createFromParcel(Parcel in) {
        return new Episode(in);
    }
    public Episode[] newArray(int size) {
        return new Episode[size];
    }
};
 

Комментарии:

1. Вы должны опубликовать свою трассировку стека.

2. Однако эта строка может вызвать это: in.readTypedList(seasons, Season. СОЗДАТЕЛЬ); сезоны не инициализировали это время.

Ответ №1:

Вы должны инициализировать свои массивы:

 public ArrayList<Episode> episodes = new ArrayList<Episode>();
public ArrayList<Season> seasons = new ArrayList<Season>();
 

в противном readTypedList случае произойдет сбой.

Комментарии:

1. Я инициализировал свои списки в своем общедоступном конструкторе, поэтому я не думал об этом thx!