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
相关产品推荐
相关产品推荐

