Android Parcelable 数组问题 [英] Android Parcelable Problem with array

查看:85
本文介绍了Android Parcelable 数组问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

大家好,我已经构建了一个实现 Parcelable 的类,但是当我阅读该类时,我定义的数组列表属性之一变空了.这是代码

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


    }
}

先谢谢大家.

推荐答案

为了读取/写入自定义类属性,您需要使用 writeParcelable 和 readParcelable 而不是将其写入数组.

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

你的 writeToParcel 方法:

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

如果你真的想使用一个数组,你必须调用 readTypedArray/writeTypedArray 方法.像这样:

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

你应该对你的 Tanda 属性做同样的事情.

And you should do the same for your Tanda properties.

希望这会有所帮助.

这篇关于Android Parcelable 数组问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆