Невозможно получить элементы списка при использовании разбираемых объектов - PullRequest
1 голос
/ 09 ноября 2011

У меня есть приложение, в котором есть служба и активность. Мой базовый класс и класс списка реализуют parcelable. И класс списка использует writeTypedList () / readTypedList () для обработки пользовательского списка. Однако при получении списка я получаю правильное количество элементов, но получаю исключение нулевого указателя при попытке получить доступ к любым элементам, кроме первого элемента списка. При выполнении writeToParcel () я вижу, что добавляются 2 элемента с правильными данными, но при выполнении readFromParcel () отображается только первый элемент, а второй элемент имеет значение null.

Любая помощь будет принята с благодарностью !!!

Вот мой список контейнеров класса:

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 Ответ

1 голос
/ 17 ноября 2011

Я думаю, что нашел проблему.Похоже, что наличие перечислимого типа WfdDeviceType в моем классе WfdDevice каким-то образом вызывало проблему.С тех пор я изменил этот тип с enum на int, и проблема исчезла.

...