#android #parcelable #custom-lists #parcel
#Android #разделяемый #пользовательские списки #посылка
Вопрос:
У меня есть приложение, в котором есть сервис и действие. Мой базовый класс и класс list реализуют parcelable. И класс list использует writeTypedList() / readTypedList() для компоновки пользовательского списка. Однако при получении списка я получаю правильное количество элементов, но получаю исключение нулевого указателя при попытке доступа к любым элементам, кроме первого элемента списка. При выполнении writeToParcel() Я вижу, что добавляются 2 элемента с правильными данными, но при выполнении readFromParcel() отображается только первый элемент, а второй элемент равен null.
Любая помощь будет высоко оценена!!!
Вот мой класс контейнера list:
public class WfdDeviceList implements Parcelable {
private static final String TAG = "WfdDeviceList";
public List<WfdDevice> devList;
public WfdDeviceList() { devList = new ArrayList<WfdDevice>(); }
public WfdDeviceList(Parcel parcel) {
this();
readFromParcel(parcel);
}
public void clear() {
devList.clear();
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel parcel, int flags) {
Log.d(TAG, "writeToParcel(): " devList.size());
Log.d(TAG, "flags: " flags);
for (WfdDevice device : devList) {
Log.d(TAG, "Writing: " device.name);
}
parcel.writeTypedList(devList);
}
public void readFromParcel(Parcel parcel) {
Log.d(TAG, "readFromParcel()");
parcel.readTypedList(devList, WfdDevice.CREATOR);
Log.d(TAG, "Size: " devList.size());
WfdDevice device = devList.get(0);
Log.d(TAG, "Device1: " device.name);
}
public static final Parcelable.Creator<WfdDeviceList> CREATOR = new Parcelable
.Creator<WfdDeviceList>() {
public WfdDeviceList createFromParcel(Parcel in) {
return new WfdDeviceList(in);
}
public WfdDeviceList[] newArray(int size) {
return new WfdDeviceList[size];
}
};
}
public class WfdDevice implements Parcelable {
public String macAddress;
public String name;
public WfdDeviceType type;
public String ipAddr;
public String pin;
public boolean isConnected;
public WfdDevice() {}
public WfdDevice(Parcel parcel) {
readFromParcel(parcel);
}
@Override
public int describeContents() {
return 0;
}
WfdDeviceType getType(int type) {
switch(type) {
case 1:
return WfdDeviceType.source;
case 2:
return WfdDeviceType.primarySink;
case 3:
return WfdDeviceType.secondarySink;
case 4:
return WfdDeviceType.sourcePrimarySink;
default:
case 0:
return WfdDeviceType.unknown;
}
}
@Override
public void writeToParcel(Parcel parcel, int flags) {
parcel.writeString(this.macAddress);
parcel.writeString(this.name);
parcel.writeInt(type.ordinal());
parcel.writeString(this.ipAddr);
parcel.writeString(this.pin);
parcel.writeInt(this.isConnected == true ? 1 : 0);
}
public void readFromParcel(Parcel parcel) {
this.macAddress = parcel.readString();
this.name = parcel.readString();
this.type = getType(parcel.readInt());
this.ipAddr = parcel.readString();
this.pin = parcel.readString();
this.isConnected = (parcel.readInt() == 1 ? true : false);
}
public static final Parcelable.Creator<WfdDevice> CREATOR = new Parcelable
.Creator<WfdDevice>() {
public WfdDevice createFromParcel(Parcel in) {
return new WfdDevice(in);
}
public WfdDevice[] newArray(int size) {
return new WfdDevice[size];
}
};
}
Ответ №1:
Я думаю, что нашел проблему. Похоже, что наличие перечисляемого типа WfdDeviceType в моем классе WfdDevice каким-то образом вызывало проблему. С тех пор я изменил этот тип с enum на int, и проблема исчезла.