2013-01-06 12 views
26

Mi piacerebbe rendere la classe A Parcelable.Come creare una classe con oggetti nidificati Parcelabile

public class A { 
    public String str; 
    public ArrayList<B> list; 
} 

Questo è quello che ho inventato finora. Tuttavia si blocca con una NullPointerException. Il problema sono queste due affermazioni: dest.writeList(list); & in.readList(list, this.getClass().getClassLoader());. Io non riesco a capire cosa fare da qui :(

Classe A

public class A implements Parcelable { 
    public String str; 
    public ArrayList<B> list; 

    @Override 
    public int describeContents() { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

    @Override 
    public void writeToParcel(Parcel dest, int flags) { 
     dest.writeString(str); 
     dest.writeList(list); 
    } 

    private A(Parcel in) { 
     str = in.readString(); 
     in.readList(list, this.getClass().getClassLoader()); 
    } 

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

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

Classe B

public class B implements Parcelable { 
    public String str; 

    @Override 
    public int describeContents() { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

    @Override 
    public void writeToParcel(Parcel dest, int flags) { 
     dest.writeString(str); 
    } 

    private B(Parcel in) { 
     str = in.readString(); 
    } 

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

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

Grazie per il vostro tempo.

risposta

43

Alla fine ho capito cosa scrivere su Google :) e ho trovato questo Android, How to use readTypedList method correctly in a Parcelable class?

La soluzione era utilizzare read-/writeTypedList invece. Inoltre, inizializzo l'arraylist per evitare ulteriori NullPointerException.

Classe A

public class A implements Parcelable { 
    public String str; 
    public ArrayList<B> list = new ArrayList<B>(); 

    @Override 
    public int describeContents() { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

    @Override 
    public void writeToParcel(Parcel dest, int flags) { 
     dest.writeString(str); 
     dest.writeTypedList(list); 
    } 

    private A(Parcel in) { 
     str = in.readString(); 
     in.readTypedList(list, B.CREATOR); 
    } 

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

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

Classe B

public class B implements Parcelable { 
    public String str; 

    @Override 
    public int describeContents() { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

    @Override 
    public void writeToParcel(Parcel dest, int flags) { 
     dest.writeString(str); 
    } 

    private B(Parcel in) { 
     str = in.readString(); 
    } 

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

     public B[] newArray(int size) { 
      return new B[size]; 
     } 
    }; 
} 
+0

si risponde accettata !! –

+0

Ah sì, non me lo permetteva e poi mi sono quasi dimenticato di questo :) –

+0

@ Snæbjørn Grazie per aver condiviso la soluzione –

18

Se si dispone di un solo Parcelable oggetto all'interno del vostro principale Parcelable oggetto, non elenca come il caso risposta accettata. Allora sarà simile al seguente:

Classe A

public class A implements Parcelable { 
    public String str; 
    public B objectB; 

    @Override 
    public int describeContents() { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

    @Override 
    public void writeToParcel(Parcel dest, int flags) { 
     //The parcelable object has to be the first one 
     dest.writeParcelable(objectB, flags); 
     dest.writeString(str); 
    } 

    private A(Parcel in) { 
     this.objectB = in.readParcelable(B.class.getClassLoader()); 
     str = in.readString(); 
    } 

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

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

Classe B

public class B implements Parcelable { 
    public String str; 

    @Override 
    public int describeContents() { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

    @Override 
    public void writeToParcel(Parcel dest, int flags) { 
     dest.writeString(str); 
    } 

    private B(Parcel in) { 
     str = in.readString(); 
    } 

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

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

IMPORTANTE: Si prega di notare che l'ordine che si scrive e leggere la Parcelable l'oggetto conta. Acquista questo answer per maggiori dettagli

0

Basta premere ALT + INVIO e sostituirlo Parcelable intende recepire tutto l'attuazione necessarie

0

È possibile aggiungere il codice generatore di plug-in Parcelable da preferenze, da lì si può creare il codice piastra della caldaia Parcelable facendo: - tasto destro nome della classe all'interno del modello - selezionare generare - selezionare Parcelable

presto - il tuo modello verrà aggiornato con necessaria codice standard Parcelable.

0

Ho avuto lo stesso problema qui è un segno generic version

class Item<T : Parcelable> (val model: T, val index: Int) : Parcelable { 

    constructor(parcel: Parcel) : 
     this(parcel.readParcelable(
      Item<T>::model.javaClass.classLoader), 
      parcel.readInt() 
     ) {} 

    override fun writeToParcel(parcel: Parcel?, flag: Int) { 
     parcel?.writeParcelable(model, 0) 
     parcel?.writeInt(index) 
    } 

    override fun describeContents(): Int { 
     return 0 
    } 

    companion object CREATOR : Parcelable.Creator<Item<Parcelable>> { 
     override fun createFromParcel(parcel: Parcel): Item<Parcelable> { 
      return Item(parcel) 
     } 

     override fun newArray(size: Int): Array<Item<Parcelable>?> { 
      return arrayOfNulls(size) 
     } 
    } 
} 
Problemi correlati