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

Android中如何从Activity向Adapter传数据?我的代码抛出运行时异常

解决Activity间传递自定义对象ArrayList的运行时异常

问题根源

你在Intent中传递ArrayList<MainData>时,MainData类没有实现序列化接口,Android系统无法序列化自定义对象进行跨组件传递,因此抛出运行时异常(通常是NotSerializableException)。


解决方案:给MainData类实现序列化接口

Android支持两种序列化方式:Serializable(简单易用)和Parcelable(Android原生,效率更高),任选其一即可。

方式1:实现Serializable接口

修改MainData类代码,添加implements Serializable,同时建议显式声明serialVersionUID(避免序列化版本冲突):

import java.io.Serializable;

public class MainData implements Serializable {
    // 显式声明序列化版本号,可选但推荐
    private static final long serialVersionUID = 1L;
    
    private String tv_name;
    private String tv_content;

    public MainData(String tv_name, String tv_content) {
        this.tv_name = tv_name;
        this.tv_content = tv_content;
    }

    // 如需读取字段,可添加getter方法(Adapter需要时)
    public String getTv_name() {
        return tv_name;
    }

    public String getTv_content() {
        return tv_content;
    }
}

方式2:实现Parcelable接口(Android推荐)

Parcelable是Android专属的序列化方式,效率比Serializable更高,适合大量数据传递:

import android.os.Parcel;
import android.os.Parcelable;

public class MainData implements Parcelable {
    private String tv_name;
    private String tv_content;

    public MainData(String tv_name, String tv_content) {
        this.tv_name = tv_name;
        this.tv_content = tv_content;
    }

    // 从Parcel中读取数据的构造方法
    protected MainData(Parcel in) {
        tv_name = in.readString();
        tv_content = in.readString();
    }

    // 必须实现的CREATOR
    public static final Creator<MainData> CREATOR = new Creator<MainData>() {
        @Override
        public MainData createFromParcel(Parcel in) {
            return new MainData(in);
        }

        @Override
        public MainData[] newArray(int size) {
            return new MainData[size];
        }
    };

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(tv_name);
        dest.writeString(tv_content);
    }

    // 添加getter方法供Adapter使用
    public String getTv_name() {
        return tv_name;
    }

    public String getTv_content() {
        return tv_content;
    }
}

如果用Parcelable,Activity A中接收数据的代码需要修改为:

list = getIntent().getParcelableArrayListExtra("key");
// 防止null导致Adapter报错
if (list == null) {
    list = new ArrayList<>();
}

额外优化:避免空指针异常

在Activity A接收数据时,建议添加null判断,防止Intent中没有传递数据导致list为null,进而引发Adapter初始化异常:

list = (ArrayList<MainData>)getIntent().getSerializableExtra("key");
// 若使用Parcelable则用getParcelableArrayListExtra
if (list == null) {
    list = new ArrayList<>();
}
adapter = new MainAdapter(this, list);
recyclerView.setAdapter(adapter);

内容的提问来源于stack exchange,提问作者Young

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 19:15:38