2011-11-09 5 views
1

サービスとアクティビティを持つアプリケーションがあります。私の基本クラスとリストクラスはparcelableを実装しています。また、リストクラスはwriteTypedList()/ readTypedList()を使用してカスタムリストをパーセルします。しかし、リストを取得するとき、正しい数の要素を取得していますが、リストの最初の要素以外の要素にアクセスしようとすると、NULLポインタ例外が発生します。 writeToParcel()を実行すると、正しいデータを持つ2つの要素が追加されていることがわかりますが、readFromParcel()を実行すると最初の要素のみが表示され、2番目の要素は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

は、ここに私のリストのコンテナクラスです。私のWfdDeviceクラスに列挙型WfdDeviceTypeを持たせていたのは何とか問題を引き起こしていたようです。私はその型を列挙型からint型に変更して、問題はなくなりました。

関連する問題