数组的Android包裹问题

数组的Android包裹问题,android,parcelable,Android,Parcelable,大家好,我已经构建了一个实现Parcelable的类,但是当我读取该类时,我定义的arraylist属性之一变为空。这是密码 package roblestech.laCartelera; import java.util.ArrayList; import android.os.Parcel; import android.os.Parcelable; public class ProgramacionPelicula implements Parcelable { public

大家好,我已经构建了一个实现Parcelable的类,但是当我读取该类时,我定义的arraylist属性之一变为空。这是密码

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


    }
}
包装roblestech.laCartelera;
导入java.util.ArrayList;
导入android.os.packet;
导入android.os.Parcelable;
公共类程序AcionPelicula实现可包裹{
公共计划{
}
公共项目Pelicula(Pelicula Pelicula){
_pelicula=pelicula;
}
公共计划电影{
_电影=电影;
}
公共字符串toString(){
如果(getVista()==ProgramacionPelicula.VISTA\u PELICULA){
返回getCine().getCine();
}否则{
返回getPelicula();
}
}
私人国际摄影展;
公共无效设置IDPROGRAMACION(int值){
_idProgramacion=值;
}
public int getIdProgramacion(){
返回(idProgramacion);;
}
私人Pelicula_Pelicula;
//公共ArrayList_peliculas=新ArrayList();
公共真空集卵器(集卵器){
_pelicula=pelicula;
}
公共Pelicula getPelicula(){
返回_pelicula;
}
私人影院;;
公共无效设置电影(电影){
_电影=电影;
}
公共电影{
返回电影;
}
public ArrayList_tandas=new ArrayList();
公共void setTandas(ArrayList值){
_tandas=值;
}
公共void setTandas(对象[]tandas){
用于(对象tanda:tandas){
if(tanda的tanda实例){
_增加((Tanda)Tanda);
}
}
}
公共无效添加坦达(坦达值){
_增加(价值);
}
公共数组列表getTandas(){
返回_tandas;
}
私人字符串_sala=“”;
公共void setSala(字符串值){
_sala=价值;
}
公共字符串getSala(){
返回萨拉;
}
公共静态最终int VISTA_CINE=0;
公共静态最终int VISTA_PELICULA=1;
私家影院;
公共int getVista(){
返回(u vista),;
}
公共计划{
ProgramacionPelicula ProgramacionPelicula=新程序acionPelicula();
项目计划书.\u idProgramacion=\u idProgramacion;
程序化pelicula._pelicula=_pelicula;
节目单.\u电影=\u电影;
程序性白斑病.\u tandas=\u tandas;
计划性精神病。_sala=_sala;
programacionPelicula._vista=vista_PELICULA;
返回程序;水蚤;
}
@凌驾
公共int描述内容(){
//TODO自动生成的方法存根
返回0;
}
@凌驾
公共无效写入包裹(包裹目的地,内部标志){
dest.writeInt(getIdProgramacion());
目标写入限制(getSala());
ArrayList peliculas=新的ArrayList();
add(getPelicula());
Object[]objectsPeliculas=peliculas.toArray();
目的地书面通知(objectsPeliculas);
Object[]objectsTanda=getTandas().toArray();
目的地书面声明(objectsTanda);
}
//这用于重新生成对象。所有包裹必须具有
//实现这两种方法的创建者
public static final Parcelable.Creator=新建Parcelable.Creator(){
公共程序AcionPelicula createFromParcel(地块中){
返回新程序acionpelicula(in);
}
公共程序AcionPelicula[]新数组(整数大小){
返回新程序acionpelicula[size];
}
};
//获取地块并为您提供填充对象的示例构造函数
//用它的价值观
私人项目AcionPelicula(地块内){
这个();
setIdProgramacion(in.readInt());
setSala(in.readString());
Object[]obj=in.readArray(Pelicula.class.getClassLoader());
毛状体((毛状体)obj[0]);
setTandas(in.readArray(Tanda.class.getClassLoader());
}
}

提前感谢大家。

为了读取/写入自定义类属性,您需要使用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);
}
@覆盖
公共无效写入包裹(包裹目的地,内部标志){
ArrayList=新建ArrayList();
列表。添加(_pelicula);
目的地writeTypedList(列表);
}
私人项目(地块内){
ArrayList=新建ArrayList();
in.readTypedList(列表,ProgrammacionPelicula.CREATOR);
}
你也应该为你的Tanda属性做同样的事情


希望这有帮助。

传递数组的另一种方法是使用类型化数组,如下所示:

@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);
}
public void writeToParcel(Parcel dest, int flags) {    
    dest.writeTypedArray(this.mMyArray, flags);
}
public MyParcelableObject(Parcel in) {
    this.mMyArray = in.createTypedArray(MyOtherParcelableObject.CREATOR);
}

简而言之,在写入数组的值之前,将数组的长度作为int值写入parcelable,这样您就可以在读取数组之前创建一个相同大小的数组。

最简洁的方法是这样写:

public MyParcelableObject(Parcel in) {
    mMyArray = new MyOtherParcelableObject[in.readInt()];
    in.readTypedArray(mMyArray, MyOtherParcelableObject.CREATOR);
}
public void writeToParcel(Parcel dest, int flags) {    
    dest.writeTypedArray(this.mMyArray, flags);
}
public MyParcelableObject(Parcel in) {
    this.mMyArray = in.createTypedArray(MyOtherParcelableObject.CREATOR);
}
这样读:

public MyParcelableObject(Parcel in) {
    mMyArray = new MyOtherParcelableObject[in.readInt()];
    in.readTypedArray(mMyArray, MyOtherParcelableObject.CREATOR);
}
public void writeToParcel(Parcel dest, int flags) {    
    dest.writeTypedArray(this.mMyArray, flags);
}
public MyParcelableObject(Parcel in) {
    this.mMyArray = in.createTypedArray(MyOtherParcelableObject.CREATOR);
}

请定义哪个属性为空?包含对象列表的数组getPeliculas。Object[]obj=in.readArray(Pelicula.class.getClassLoader());毛状体((毛状体)obj[0]);嘿,珍,我下面的答案能解决你的问题吗?