【问题标题】:How to serialize a List of custom objects and recover it onRestoreInstanceState in Android?如何序列化自定义对象列表并在 Android 中恢复 onRestoreInstanceState?
【发布时间】:2014-04-27 13:24:52
【问题描述】:

大家好,我有一个自定义对象 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 是一个列表。

现在在 onRestoreInstanceState 我已经尝试过这段代码:

@Override
protected void onRestoreInstanceState(Bundle savedState) {
    super.onRestoreInstanceState(savedState);

    MasterAndDetailStatistics = (List<MasterWithValue>) savedState.getSerializable("master_detail_list");

}

我收到一个类型安全警告:类型安全:未经检查的从可序列化到列表的强制转换 如何检查它?我读到我应该实现 Parcable 接口,但我是 android 新手,我不知道如何做到这一点。我该怎么办?

【问题讨论】:

    标签: java android serializable


    【解决方案1】:

    关于如何实现 Parcelable 的例子有很多。 Here is the canonical one.Here is an answer from SO.

    基本上,您实现了一个方法public void writeToParcel(Parcel out, int flags),在该方法中,您将所有想要持久化的字段写入out 值。

    然后实现 Parcelable.Creator 的匿名实现,使用您的 parcelable 类进行参数化。此匿名实现必须命名为 CREATOR

    最后,像这样创建一个私有构造函数:private MyParcelable(Parcel in)。您将在out 中写入的所有值读回in 中对象的字段。

    那么你也需要使 Detail parcelable !哦,快乐!

    它需要看起来像这样:

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

    【讨论】:

    • 感谢您的回复。如果一个 MasterWithValue 类扩展了一个 Master 类,它们应该一起实现 Parcelable 接口吗?我的意思是我在 Master 类中实现 Parcelable 接口,然后在 MasterWithValue 中重写这些方法,以便同时保存 MasterWithValue 对象的值,因为 MasterWithValue 具有 Master 类没有的 value 字段。我说的对吗?
    • 当我尝试调用 writeTypedArrayList() 时,我也得到了这个:方法 writeTypedArrayList(List) 未定义类型 Parcel。也许您打算使用 writeTypedList(detailList)?
    • 是的,我可能很着急,意思是writeTypedList。对于后代类,您需要覆盖writeToParcel 方法(尽管调用super.writeToParcel 您不需要复制任何逻辑)。构造函数是私有的,所以它不能被覆盖或调用,并且必须被复制。 CREATOR 字段是公共的和静态的,因此不应更改。老实说,当您将 parcelable 与继承一起使用时,它看起来很丑陋。当然,我认为它首先看起来很丑。 (我通常更喜欢将我的类序列化为字符串(使用 JSON)或字节。)
    • 感谢它的工作!谢谢你的解释,你说的很清楚很简单!
    猜你喜欢
    • 1970-01-01
    • 2012-06-07
    • 1970-01-01
    • 2014-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多