2013-01-06 55 views
26

我想创建A类Parcelable类。如何使用嵌套对象创建类Parcelable

public class A { 
    public String str; 
    public ArrayList<B> list; 
} 

这是我想出这么远。但是它会因NullPointerException而崩溃。问题是这两个陈述:dest.writeList(list); & in.readList(list, this.getClass().getClassLoader());。 我想不出什么从这里做:(

A类

public class A implements Parcelable { 
    public String str; 
    public ArrayList<B> list; 

    @Override 
    public int describeContents() { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

    @Override 
    public void writeToParcel(Parcel dest, int flags) { 
     dest.writeString(str); 
     dest.writeList(list); 
    } 

    private A(Parcel in) { 
     str = in.readString(); 
     in.readList(list, this.getClass().getClassLoader()); 
    } 

    public static final Parcelable.Creator<A> CREATOR 
      = new Parcelable.Creator<A>() { 
     public A createFromParcel(Parcel in) { 
      return new A(in); 
     } 

     public A[] newArray(int size) { 
      return new A[size]; 
     } 
    }; 
} 

B类

public class B implements Parcelable { 
    public String str; 

    @Override 
    public int describeContents() { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

    @Override 
    public void writeToParcel(Parcel dest, int flags) { 
     dest.writeString(str); 
    } 

    private B(Parcel in) { 
     str = in.readString(); 
    } 

    public static final Parcelable.Creator<B> CREATOR 
      = new Parcelable.Creator<B>() { 
     public B createFromParcel(Parcel in) { 
      return new B(in); 
     } 

     public B[] newArray(int size) { 
      return new B[size]; 
     } 
    }; 
} 

谢谢您的时间。

回答

43

我终于想出了要输入Google的内容:),并发现这个Android, How to use readTypedList method correctly in a Parcelable class?

解决方案是使用read-/writeTypedList来代替。我还初始化arraylist以避免任何进一步的NullPointerException。

A类

public class A implements Parcelable { 
    public String str; 
    public ArrayList<B> list = new ArrayList<B>(); 

    @Override 
    public int describeContents() { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

    @Override 
    public void writeToParcel(Parcel dest, int flags) { 
     dest.writeString(str); 
     dest.writeTypedList(list); 
    } 

    private A(Parcel in) { 
     str = in.readString(); 
     in.readTypedList(list, B.CREATOR); 
    } 

    public static final Parcelable.Creator<A> CREATOR 
      = new Parcelable.Creator<A>() { 
     public A createFromParcel(Parcel in) { 
      return new A(in); 
     } 

     public A[] newArray(int size) { 
      return new A[size]; 
     } 
    }; 
} 

B类

public class B implements Parcelable { 
    public String str; 

    @Override 
    public int describeContents() { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

    @Override 
    public void writeToParcel(Parcel dest, int flags) { 
     dest.writeString(str); 
    } 

    private B(Parcel in) { 
     str = in.readString(); 
    } 

    public static final Parcelable.Creator<B> CREATOR 
      = new Parcelable.Creator<B>() { 
     public B createFromParcel(Parcel in) { 
      return new B(in); 
     } 

     public B[] newArray(int size) { 
      return new B[size]; 
     } 
    }; 
} 
+0

标记你回答所接受! –

+0

啊,是的,它不会让我,然后我有点忘了它:) –

+0

@Snæbjørn感谢分享解决方案 –

18

如果你有你的主要Parcelable对象内部只有一个Parcelable对象,没有列出像接受的答案的情况。然后,它会像下面这样:

A类

public class A implements Parcelable { 
    public String str; 
    public B objectB; 

    @Override 
    public int describeContents() { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

    @Override 
    public void writeToParcel(Parcel dest, int flags) { 
     //The parcelable object has to be the first one 
     dest.writeParcelable(objectB, flags); 
     dest.writeString(str); 
    } 

    private A(Parcel in) { 
     this.objectB = in.readParcelable(B.class.getClassLoader()); 
     str = in.readString(); 
    } 

    public static final Parcelable.Creator<A> CREATOR 
      = new Parcelable.Creator<A>() { 
     public A createFromParcel(Parcel in) { 
      return new A(in); 
     } 

     public A[] newArray(int size) { 
      return new A[size]; 
     } 
    }; 
} 

B类

public class B implements Parcelable { 
    public String str; 

    @Override 
    public int describeContents() { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

    @Override 
    public void writeToParcel(Parcel dest, int flags) { 
     dest.writeString(str); 
    } 

    private B(Parcel in) { 
     str = in.readString(); 
    } 

    public static final Parcelable.Creator<B> CREATOR 
      = new Parcelable.Creator<B>() { 
     public B createFromParcel(Parcel in) { 
      return new B(in); 
     } 

     public B[] newArray(int size) { 
      return new B[size]; 
     } 
    }; 
} 

重要: 请注意,如果您写入和读取顺序Parcelable对象事项。结帐这个answer了解更多详情

0

只要按下ALT + ENTER并更换Parcelable将实施所有必要的实施

0

您可以从首选项添加Parcelable代码生成器插件,从那里你可以创建parcelable锅炉板代码这样做: - 右键点击模型 内的类名称 - 选择产生 - 选择Parcelable

似的 - 你的模型将需要Parcelable样板代码进行更新。

0

我在这里同样的问题,是一个generic version

class Item<T : Parcelable> (val model: T, val index: Int) : Parcelable { 

    constructor(parcel: Parcel) : 
     this(parcel.readParcelable(
      Item<T>::model.javaClass.classLoader), 
      parcel.readInt() 
     ) {} 

    override fun writeToParcel(parcel: Parcel?, flag: Int) { 
     parcel?.writeParcelable(model, 0) 
     parcel?.writeInt(index) 
    } 

    override fun describeContents(): Int { 
     return 0 
    } 

    companion object CREATOR : Parcelable.Creator<Item<Parcelable>> { 
     override fun createFromParcel(parcel: Parcel): Item<Parcelable> { 
      return Item(parcel) 
     } 

     override fun newArray(size: Int): Array<Item<Parcelable>?> { 
      return arrayOfNulls(size) 
     } 
    } 
} 
相关问题