2011-11-09 78 views
1

我有一個具有服務和活動的應用程序。我的基類和列表類正在實現parcelable。列表類使用writeTypedList()/ readTypedList()來加載自定義列表。然而,當檢索列表時,我得到正確數量的元素,但在嘗試訪問除列表的第一個元素之外的任何元素時,卻得到空指針異常。在執行writeToParcel()時,我可以看到正在添加2個具有正確數據的元素,但是在執行readFromParcel()時,只有第一個元素出現,第二個元素爲空。使用可分段對象時無法獲取列表元素

任何幫助將不勝感激!

這裏是我的名單容器類:

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

我想我已經找到了問題。這似乎是在我的WfdDevice類中使用枚舉類型WfdDeviceType導致了問題。我已經把這種類型從一個枚舉變成了一個int,並且問題消失了。