Problema parcelable Android con arrays

Ciao a tutti ho costruito una class che implementa Parcelable, ma uno degli attributi arrayslist che ho definito diventa vuoto quando leggo la class. Ecco il codice

package roblestech.laCartelera; import java.util.ArrayList; import android.os.Parcel; import android.os.Parcelable; public class ProgramacionPelicula implements Parcelable { public ProgramacionPelicula() { } public ProgramacionPelicula(Pelicula pelicula) { _pelicula = pelicula; } public ProgramacionPelicula(Cine cine) { _cine = cine; } public String toString() { if (getVista() == ProgramacionPelicula.VISTA_PELICULA) { return getCine().getCine(); } else { return getPelicula().getTituloOriginal(); } } private int _idProgramacion; public void setIdProgramacion(int value) { _idProgramacion = value; } public int getIdProgramacion() { return _idProgramacion; } private Pelicula _pelicula; // public ArrayList<Pelicula> _peliculas = new ArrayList<Pelicula>(); public void setPelicula(Pelicula pelicula) { _pelicula = pelicula; } public Pelicula getPelicula() { return _pelicula; } private Cine _cine; public void setCine(Cine cine) { _cine = cine; } public Cine getCine() { return _cine; } public ArrayList<Tanda> _tandas = new ArrayList<Tanda>(); public void setTandas(ArrayList<Tanda> value) { _tandas = value; } public void setTandas(Object[] tandas) { for (Object tanda : tandas) { if (tanda instanceof Tanda) { _tandas.add((Tanda) tanda); } } } public void addTanda(Tanda value) { _tandas.add(value); } public ArrayList<Tanda> getTandas() { return _tandas; } private String _sala = ""; public void setSala(String value) { _sala = value; } public String getSala() { return _sala; } public static final int VISTA_CINE = 0; public static final int VISTA_PELICULA = 1; private int _vista = VISTA_CINE; public int getVista() { return _vista; } public ProgramacionPelicula toPelicula() { ProgramacionPelicula programacionPelicula = new ProgramacionPelicula(); programacionPelicula._idProgramacion = _idProgramacion; programacionPelicula._pelicula = _pelicula; programacionPelicula._cine = _cine; programacionPelicula._tandas = _tandas; programacionPelicula._sala = _sala; programacionPelicula._vista = VISTA_PELICULA; return programacionPelicula; } @Override public int describeContents() { // TODO Auto-generated method stub return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeInt(getIdProgramacion()); dest.writeString(getSala()); ArrayList<Pelicula> peliculas = new ArrayList<Pelicula>(); peliculas.add(getPelicula()); Object[] objectsPeliculas = peliculas.toArray(); dest.writeArray(objectsPeliculas); Object[] objectsTanda = getTandas().toArray(); dest.writeArray(objectsTanda); } // this is used to regenerate your object. All Parcelables must have a // CREATOR that implements these two methods public static final Parcelable.Creator<ProgramacionPelicula> CREATOR = new Parcelable.Creator<ProgramacionPelicula>() { public ProgramacionPelicula createFromParcel(Parcel in) { return new ProgramacionPelicula(in); } public ProgramacionPelicula[] newArray(int size) { return new ProgramacionPelicula[size]; } }; // example constructor that takes a Parcel and gives you an object populated // with it's values private ProgramacionPelicula(Parcel in) { this(); setIdProgramacion(in.readInt()); setSala(in.readString()); Object[] obj = in.readArray(Pelicula.class.getClassLoader()); setPelicula((Pelicula) obj[0]); setTandas(in.readArray(Tanda.class.getClassLoader())); } } 

Ringrazio in anticipo tutti.

  • I pulsanti di RadioGroup perdono lo stato dopo la scansione di ListView
  • Come posso monitorare lo stato della scheda GPS utilizzando Android SDK?
  • API Google Drive - il nome non deve essere vuoto: null (ma avevo passato un nome account valido a GoogleAccountCredential)
  • DeadObjectException con com.google.android.gms
  • La casella di controllo non è selezionata quando scorri l'elenco di liste su Android
  • Spostare per passare alla selezione della scheda
  • Posizione del database SQLite in eclipse per Android utilizzando il phonegap
  • Ottenere la versione di dispositivo os in Android in modo programmato
  • Come spegnere un android mobile in modo programmato?
  • Imansible get RecyclerView.Adapter da visualizzare correttamente
  • Android: come contrassegnare sms come letto in onReceive
  • Android - utilizzare ant per creare configurazioni di build che modificano i valori di configuration
  • 2 Solutions collect form web for “Problema parcelable Android con arrays”

    Per leggere / scrivere una properties; di class personalizzata è necessario utilizzare writeParcelable e readParcelable invece di scrivere in una matrix.

    Modificare il tuo constructor di pacchetti a:

     private ProgramacionPelicula(Parcel in) { this(); setIdProgramacion(in.readInt()); setSala(in.readString()); _pelicula = in.readParcelable(Pelicula.class.getClassLoader()); setTandas(in.readArray(Tanda.class.getClassLoader())); } 

    E il metodo writeToParcel per:

     @Override public void writeToParcel(Parcel dest, int flags) { dest.writeInt(getIdProgramacion()); dest.writeString(getSala()); dest.writeParcelable(_pelicula, flags); Object[] objectsPeliculas = peliculas.toArray(); dest.writeArray(objectsPeliculas); Object[] objectsTanda = getTandas().toArray(); dest.writeArray(objectsTanda); } 

    Se si desidera veramente utilizzare una matrix, è necessario ricall i methods readTypedArray / writeTypedArray. Così:

     @Override public void writeToParcel(Parcel dest, int flags) { ArrayList<Pelicula> list = new ArrayList<Pelicula>(); list.add(_pelicula); dest.writeTypedList(list); } private ProgrammacionPelicula(Parcel in) { ArrayList<Pelicula> list = new ArrayList<Pelicula>(); in.readTypedList(list, ProgrammacionPelicula.CREATOR); } 

    E dovresti fare lo stesso per le tue properties; Tanda.

    Spero che questo ti aiuti.

    Un altro modo per passare una matrix potrebbe essere l'utilizzo di arrays digitati come segue:

     @Override public void writeToParcel(Parcel dest, int flags) { dest.writeInt(mMyArray.length); dest.writeTypedArray(mMyArray, flags); } 

    E per leggerlo come questo:

     public MyParcelableObject(Parcel in) { mMyArray = new MyOtherParcelableObject[in.readInt()]; in.readTypedArray(mMyArray, MyOtherParcelableObject.CREATOR); } 

    Insum, scrivere la lunghezza dell'arrays come valore int al pacchetto, prima di scrivere i propri valori, in modo da poter creare una matrix della stessa dimensione prima di leggerla.

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.