ArrayList‹String› null при построении Parcel

Один из моих классов имеет 3 свойства ArrayList, например:

public class Product implements Parcelable{

// other properties

private ArrayList<String> categoryIds;
private ArrayList<String> categorySlugs;
private ArrayList<String> categoryNames;

public Product(){}

// getters and setters

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

@Override
public void writeToParcel(Parcel dest, int flags) {
    // writing other properties
    dest.writeStringList(categoryIds); // here aren't null
    dest.writeStringList(categorySlugs);
    dest.writeStringList(categoryNames);
}

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

public Product(Parcel in){

    // reading other properties, all correct

    in.readStringList(categoryIds); // from here are all null
    in.readStringList(categorySlugs);
    in.readStringList(categoryNames);
}

}

Прочтите комментарии в конструкторе Parcel. Эти три равны нулю, но в функции "writeToParcel" они не равны нулю. Все остальные свойства правильные. Что мне здесь не хватает?

Спасибо :)


person Alberto Garrido    schedule 28.08.2015    source источник
comment
Вы никогда не создаете экземпляр List для создания экземпляра. Вам нужно private ArrayList<String> categoryIds = new ArrayList<String>(); new ArrayList<String>() является важной частью, так как здесь вы создаете экземпляр объекта.   -  person TEK    schedule 28.08.2015
comment
Я впервые использую строку ArrayList в посылке. До сих пор у меня также был массив моего пользовательского класса: ArrayList‹ProductLocation›, и мне не нужно создавать экземпляры. Но вы совершенно правы, это сработало, спасибо!! если вы опубликуете это как ответ, я приму это.   -  person Alberto Garrido    schedule 28.08.2015
comment
Сделанный. Рад, что смог хоть как-то помочь. :)   -  person TEK    schedule 28.08.2015


Ответы (2)


Вы никогда не создаете экземпляр List для создания экземпляра.

Например, вам нужно:

private ArrayList<String> categoryIds = new ArrayList<String>();

new ArrayList<String>() является важной частью, так как здесь вы создаете экземпляр объекта.

Еще лучше создать эти списки в конструкторе Product. Также рассмотрите возможность кодирования для интерфейса.

person TEK    schedule 28.08.2015

Используйте приведенный ниже код для чтения списков:

categoryIds = in.createStringArrayList()
person Abdullah    schedule 28.08.2015