You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 07:51:50