Android中传递CardView对象数组至另一个Activity时数值异常问题
问题分析与解决方案
你遇到的问题根源在于CardView类的Parcelable实现不完整——你没有在序列化和反序列化过程中处理number属性,导致传递到MainActivity2后,对象的number被重置为int类型的默认值0。
问题出在哪?
当你通过Intent传递Parcelable对象时,系统会调用writeToParcel()把对象的状态写入Parcel,然后在目标Activity中通过CREATOR的createFromParcel()方法从Parcel重建对象。但你的代码里:
writeToParcel()方法是空的,没有把number写入Parcel- 从Parcel构造对象的
CardView(Parcel in)构造函数也没有读取Parcel里的number值
这就导致传递后的CardView对象完全丢失了原来的number数据。
修复后的CardView代码
把CardView类修改成下面这样,完整实现Parcelable的序列化和反序列化逻辑:
public class CardView implements Parcelable { int number; public CardView(int number){ this.number = number; } public int getNumber() { return number; } // 从Parcel读取数据,恢复对象状态 protected CardView(Parcel in) { number = in.readInt(); // 读取之前写入的number值 } public static final Creator<CardView> CREATOR = new Creator<CardView>() { @Override public CardView createFromParcel(Parcel in) { return new CardView(in); } @Override public CardView[] newArray(int size) { return new CardView[size]; } }; @Override public int describeContents() { return 0; } // 把对象状态写入Parcel @Override public void writeToParcel(Parcel parcel, int i) { parcel.writeInt(number); // 将number写入Parcel } }
为什么这样修复?
writeToParcel(Parcel parcel, int i)中添加parcel.writeInt(number):把number的值写入Parcel,完成序列化CardView(Parcel in)构造函数中添加number = in.readInt():从Parcel中读取之前写入的number值,完成反序列化
你的MainActivity和MainActivity2的代码不需要修改,只要CardView正确实现Parcelable,传递后调用getNumber()就能得到原来的初始值了。
内容的提问来源于stack exchange,提问作者Yaniv
相关产品推荐
相关产品推荐

