我尝试通过意图发送Parcelable数据,但我得到了:
java.lang.RuntimeException:Parcelable遇到IOException,编写可序列化对象(name = java.util.HashMap)
使用android parcelable生成器插件生成了parcelable类。 我相信hashmap不能以这种方式分配,那么解决方案是什么呢?
这是我的代码:
public class Menu extends Product implements Parcelable {
private HashMap<Option,ArrayList<Article>> options = new HashMap<>();
private int calories = 0;
public Menu(String name, double price, String description, String pictureSrc){
super(name,price,description,pictureSrc);
for(Option option:Option.values()){
ArrayList<Article> articles = new ArrayList<>();
articles.add(new Article(""));
articles.add(new Article("Choisir un article ..."));
options.put(option,articles);
}
}
public HashMap<Option,ArrayList<Article>> getOptions() {
return options;
}
public void setOptions(HashMap<Option,ArrayList<Article>> options) {
this.options = options;
this.calories = 0;
int i = 0;
for(Option option:options.keySet()){
for(Article article:options.get(i)){
calories += article.getCalories();
}
}
}
public void addOption(Option option, Article article){
article.addIncludedInMenu(this);
if(options.containsKey(option))
options.get(option).add(article);
else{
ArrayList<Article> articles = new ArrayList<>();
articles.add(article);
options.put(option,articles);
}
calories += article.getCalories();
}
public void removeOption(Option option, Article article){
article.removeIncludedInMenu(this);
this.options.get(option).remove(article);
calories -= article.getCalories();
}
public int getCalories() {
return calories;
}
@Override
public boolean equals(Object obj) {
return obj==this;
}
@Override
public String toString() {
return this.name;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
super.writeToParcel(dest, flags);
dest.writeSerializable(this.options);
dest.writeInt(this.calories);
}
protected Menu(Parcel in) {
super(in);
this.options = (HashMap<Option, ArrayList<Article>>) in.readSerializable();
this.calories = in.readInt();
}
public static final Creator<Menu> CREATOR = new Creator<Menu>() {
@Override
public Menu createFromParcel(Parcel source) {
return new Menu(source);
}
@Override
public Menu[] newArray(int size) {
return new Menu[size];
}
};
感谢您的帮助。
答案 0 :(得分:0)
ArrayList已经实现了serializable。 所以,解决问题的另一个想法是: 使用选项作为额外名称传递ArrayLists,并且您需要在哪里,您可以再次迭代。
这样的事情:
final Bundle bundle = new Bundle();
for(Option option:Option.values()){
ArrayList<Article> articles = new ArrayList<>();
articles.add(new Article(""));
articles.add(new Article("Choisir un article ..."));
bundle.putSerializable(String.valueOf(option), articles);
}
然后,在接收意图的部分中,你可以
for(Option option:Option.values()){
if (getIntent().hasExtra(String.valueOf(option))){
ArrayList<Article> articles = getSerializableExtra(option);
// add to your hashmap
}
}