Android Parcelable 数组问题

发布于 2024-12-01 02:02:57 字数 4213 浏览 1 评论 0原文

大家好,我已经构建了一个实现 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()));


    }
}

先谢谢大家。

Hi everybody i have build a class that implements Parcelable but one of the arraylist attributes i have define gets empty when i read the class. Here is the code

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


    }
}

Thanks in advance everybody.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

信愁 2024-12-08 02:02:57

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

@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,这样您就可以创建一个在读取之前先将其设置为相同大小的数组。

Another way to pass an array would be using typed arrays as follows:

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

And to read it back like this:

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

In short, write the length of the array as an int value to the parcelable, right before writing its values, so you can create an array of the same size before reading it.

浅浅淡淡 2024-12-08 02:02:57

为了读/写自定义类属性,您需要使用 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 房产做同样的事情。

希望这有帮助。

In order to read/write a custom class property you need to use writeParcelable and readParcelable in stead of writing it into an array.

Change your parcel constructor to:

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

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

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

And your writeToParcel method to:

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

If you really want to use an array, you must invoke the readTypedArray/writeTypedArray methods. Like so:

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

And you should do the same for your Tanda properties.

Hope this helps.

甜扑 2024-12-08 02:02:57

最简洁的,这样写:

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

读起来像这样:

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

The most concise, write like this:

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

and read like this:

public MyParcelableObject(Parcel in) {
    this.mMyArray = in.createTypedArray(MyOtherParcelableObject.CREATOR);
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文