[英]How to serialize a List of custom objects and recover it onRestoreInstanceState in Android?
大家好我有一个自定义对象MasterWithValue(一个带有值的对象和我已经制作的Detail对象列表),它扩展了一个类Master(它只有一个name属性)。
这是MasterWithValue类:
public class MasterWithValue extends Master {
private String value;
private List<Detail> detailList;
public MasterWithValue(String masterName, String masterValue) {
super(masterName);
this.value = masterValue;
this.detailList = new ArrayList<Detail>();
}
@Override
public int getViewType() {
return super.getViewType();
}
@Override
public View getView(LayoutInflater inflater, View convertView) {
View view;
if (convertView == null) {
view = inflater.inflate(R.layout.statistics_rowlist_master, null);
}
else {
view = convertView;
}
TextView MasterEntryName = (TextView) view.findViewById(R.id.statistics_master_name);
TextView MasterEntryValue = (TextView) view.findViewById(R.id.statistics_master_value);
MasterEntryName.setText(super.name);
MasterEntryValue.setText(this.value);
return view;
}
public String getMasterValue() {
return value;
}
public List<Detail> getDetailList() {
return this.detailList;
}
public void addDetailToMaster(Detail detail) {
this.detailList.add(detail);
}
}
在onSaveInstanceState()方法中,我有这样的代码:
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putSerializable("master_detail_list", (ArrayList<MasterWithValue>)
MasterAndDetailStatistics);
}
MasterAndDetailStatistics是List的位置。
现在在onRestoreInstanceState我试过这段代码:
@Override
protected void onRestoreInstanceState(Bundle savedState) {
super.onRestoreInstanceState(savedState);
MasterAndDetailStatistics = (List<MasterWithValue>) savedState.getSerializable("master_detail_list");
}
我得到了一个类型安全警告:类型安全:从Serializable到List的未选中强制转换如何检查它? 我读到我应该实现Parcable接口,但我是android的新手,我不知道如何做到这一点。 我该怎么办?
有很多关于如何实现parcelable的例子。 这是规范的。 这是SO的答案。
基本上,您实现了一个方法public void writeToParcel(Parcel out, int flags)
,您可以将所有要public void writeToParcel(Parcel out, int flags)
的字段写入out
值。
然后实现匿名实施的Parcelable.Creator
与parcelable类参数。 此匿名实现必须命名为CREATOR
。
最后,创建一个这样的私有构造函数: private MyParcelable(Parcel in)
。 在这里,您将所有在out
写入的值读回到in in
对象的字段in
。
然后你需要让细节也可以制作! 哦,快乐!
它需要看起来像这样:
public class MasterWithDetails implements Parcelable {
private String value;
private List<Detail> detailList;
public int describeContents() {
return 0;
}
public void writeToParcel(Parcel out, int flags) {
out.writeString(value);
out.writeString(getName());
out.writeTypedList(detailList); //don't forget to make Detail parcelable too!
}
public static final Parcelable.Creator<MasterWithDetails> CREATOR
= new Parcelable.Creator<MasterWithDetails>() {
public MasterWithDetails createFromParcel(Parcel in) {
return new MasterWithDetails(in);
}
public MasterWithDetails[] newArray(int size) {
return new MasterWithDetails[size];
}
};
private MasterWithDetails(Parcel in) {
value = in.readString();
setName(in.readString());
detailList = in.createTypedArrayList(Detail.CREATOR);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.