2017-08-24 3 views
1

J'ai un objet Parcelable qui a une liste d'objets Parcelable. Je suis en train de lire cette liste de retour après avoir été passé d'une activité à l'autre, mais seul le premier élément est « non fourni »Parcelable with List désérialise seulement le premier élément

public class MyBundle implements Parcelable { 
    private List<Data> dataList; 

    public static final Parcelable.Creator<MyBundle> CREATOR = new Parcelable.Creator<MyBundle>() { 
     public MyBundle createFromParcel(Parcel in) { 
      return new MyBundle(in); 
     } 

     public MyBundle[] newArray(int size) { 
      return new MyBundle[size]; 
     } 
    }; 

    public MyBundle() { 
    } 

    public MyBundle(Parcel in) { 
     //dataList = new ArrayList<>(); 
     //in.readTypedList(dataList, Data.CREATOR); 
     dataList = in.createTypedArrayList(Data.CREATOR); 
     //BOTH have the same result 
    } 

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

    @Override 
    public void writeToParcel(Parcel dest, int flags) { 
     if (dataList != null && dataList.size() > 0) { 
      dest.writeTypedList(dataList); 
     } 
    } 
} 

L'objet de données:

/*BaseObject has the following properties: 
    UUID uuid; 
    long databaseId; 
    createdDate; 
    modifiedDate; 
*/ 
public class Data extends BaseObject implements Parcelable { 
    private String name; 
    private String serial; 
    private String location; 

    public Data() {} 

    private Data(Parcel in) { 
     String uuidString = in.readString(); 
     if (uuidString == null) return; //this is null! 
     uuid = UUID.fromString(idString); 
     databaseId = in.readLong(); 
     createdDate = new Date(in.readLong()); 
     modifiedDate = new Date(in.readLong()); 
     location = in.readString(); 

     name = in.readString(); 
     serial = in.readString(); 
    } 

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

    @Override 
    public void writeToParcel(Parcel dest, int flags) { 
     dest.writeString(uuid.toString()); 
     dest.writeLong(databaseId); 
     dest.writeLong(createdDate.getTime()); 
     dest.writeLong(modifiedDate.getTime()); 

     dest.writeString(name); 
     dest.writeString(serial); 
    } 

    public static final Parcelable.Creator<Data> CREATOR 
      = new Parcelable.Creator<Data>() { 
     public Data createFromParcel(Parcel in) { 
      return new Data(in); 
     } 

     public Data[] newArray(int size) { 
      return new Data[size]; 
     } 
    }; 
} 

Qu'est-ce que J'ai essayé:

Répondre

0

C'est donc la réponse: Mon parcelable Data rate l'élément de l'emplacement où il crée le colis. Cela entraîne évidemment une sorte d'erreur de décalage lors de la lecture. Donc, la solution codée est la suivante:

@Override 
    public void writeToParcel(Parcel dest, int flags) { 
     dest.writeString(uuid.toString()); 
     dest.writeLong(databaseId); 
     dest.writeLong(createdDate.getTime()); 
     dest.writeLong(modifiedDate.getTime()); 
     dest.writeString(location); /*HERE!*/ 
     dest.writeString(name); 
     dest.writeString(serial); 
    } 

J'espère que cela aidera quelqu'un d'autre.