2011-08-23 59 views
3

大家好,我有建立一個實現Parcelable但ArrayList的屬性之一,我有定義,當我讀到類變成空的類。這裏是代碼的Android Parcelable問題與陣列

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())); 


    } 
} 

在此先感謝大家。

+0

可否請你定義哪個屬性是空的? –

+0

陣列getPeliculas包含對象的列表。 對象[] OBJ = in.readArray(Pelicula.class.getClassLoader()); setPelicula((PELICULA)OBJ [0]); –

+0

嘿讓,確實我的回答如下解決問題了嗎? –

回答

4

爲了讀取/寫入自定義類屬性,您需要使用writeParcelable和readParcelable來代替將其寫入數組。

你的包裹構造改爲:

private ProgramacionPelicula(Parcel in) { 
    this(); 
    setIdProgramacion(in.readInt()); 
    setSala(in.readString()); 

    _pelicula = in.readParcelable(Pelicula.class.getClassLoader()); 

    setTandas(in.readArray(Tanda.class.getClassLoader())); 
} 

和你writeToParcel方法:

@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); 
} 

如果你真的想用一個數組,你必須調用readTypedArray/writeTypedArray方法。像這樣:

@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); 
} 

而且你應該對你的Tanda屬性也這樣做。

希望這會有所幫助。

7

另一種方式傳遞數組將使用類型數組如下:

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

並讀回這樣的:

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

簡言之,寫在陣列的長度一個int值到parcelable,正確書寫它的值之前,所以你可以閱讀它之前創建一個同樣大小的數組。

0

最簡潔的,這樣寫:

public void writeToParcel(Parcel dest, int flags) {  
    dest.writeTypedArray(this.mMyArray, flags); 
} 

,讀這樣的:

public MyParcelableObject(Parcel in) { 
    this.mMyArray = in.createTypedArray(MyOtherParcelableObject.CREATOR); 
}