2011-08-23 2 views
3

안녕하세요 모두들 Parcelable 구현 클래스를 만들었지 만 내가 정의한 arraylist 속성 중 하나는 클래스를 읽을 때 비어있게됩니다. 코드는 다음과 같습니다안드로이드 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. Object [] 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); 
} 

, 배열과의 길이를 쓰기 값을 기입하기 직전에 parcelable의 int 치를 돌려주기 전에, 같은 사이즈의 배열을 읽어 들일 수가 있습니다.

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

과 같이 읽기 :

0

이 가장 간결하고 같이 쓰기

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