[英]NullPointerException when sending nested ArrayList via Parcelable
I am trying to send a nested ArrayList object via Parcelable intent.我正在尝试通过 Parcelable 意图发送嵌套的 ArrayList 对象。 Name of custom object is 'ExampleItem' which contains nested custom object 'B'.
自定义对象的名称是“ExampleItem”,其中包含嵌套的自定义对象“B”。 I am sending from MainActivity to Activity2.
我正在从 MainActivity 发送到 Activity2。 I get NullPointerException error "Attempt to invoke interface method 'boolean java.util.List.add(java.lang.Object)' on a null object reference" .
我收到 NullPointerException 错误“Attempt to invoke interface method 'boolean java.util.List.add(java.lang.Object)' on a null object reference” 。 How do i succesfully send via Parcelable?
我如何通过 Parcelable 成功发送?
Main Activity主要活动
public class MainActivity extends AppCompatActivity {
private ArrayList<ExampleItem> mExampleList;
private ArrayList<B> mBList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void Press(View view) {
B b = new B("hello");
mBList = new ArrayList<>();
mBList.add(b);
mExampleList = new ArrayList<>();
mExampleList.add(new ExampleItem(R.drawable.ic_launcher_background, "Line 1", "Line 2", mBList));
mExampleList.add(new ExampleItem(R.drawable.ic_launcher_foreground, "Line 3", "Line 4", mBList));
mExampleList.add(new ExampleItem(R.drawable.ic_launcher_foreground, "Line 5", "Line 6", mBList));
Intent intent = new Intent(MainActivity.this, Activity2.class);
intent.putParcelableArrayListExtra("Example Item", mExampleList);
startActivity(intent);
}
}
Activity2活动2
public class Activity2 extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity2);
Intent intent = getIntent();
ArrayList<ExampleItem> exampleItem = intent.getParcelableArrayListExtra("Example Item");
}
}
ExampleItem示例项目
public class ExampleItem implements Parcelable {
private int mImageResource;
private String mText1;
private String mText2;
private ArrayList<B> mList;
public ExampleItem(int imageResource, String text1, String text2, ArrayList<B> list) {
mImageResource = imageResource;
mText1 = text1;
mText2 = text2;
mList = list;
}
protected ExampleItem(Parcel in) {
mImageResource = in.readInt();
mText1 = in.readString();
mText2 = in.readString();
in.readList(mList, this.getClass().getClassLoader());
}
public static final Creator<ExampleItem> CREATOR = new Creator<ExampleItem>() {
@Override
public ExampleItem createFromParcel(Parcel in) {
return new ExampleItem(in);
}
@Override
public ExampleItem[] newArray(int size) {
return new ExampleItem[size];
}
};
public int getImageResource() {
return mImageResource;
}
public String getText1() {
return mText1;
}
public String getText2() {
return mText2;
}
public ArrayList<B> getmList() {
return mList;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(mImageResource);
dest.writeString(mText1);
dest.writeString(mText2);
dest.writeList(mList);
}
}
B乙
public class B implements Parcelable {
public String str;
@Override
public int describeContents() {
// TODO Auto-generated method stub
return 0;
}
public B(String str) {
this.str = str;
}
private B(Parcel in) {
str = in.readString();
}
public static final Parcelable.Creator<B> CREATOR
= new Parcelable.Creator<B>() {
public B createFromParcel(Parcel in) {
return new B(in);
}
public B[] newArray(int size) {
return new B[size];
}
};
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(str);
}
}
Output Log输出日志
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.codinginflow.exampleparcelable, PID: 9376
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.codinginflow.exampleparcelable/com.codinginflow.exampleparcelable.Activity2}: java.lang.NullPointerException: Attempt to invoke interface method 'boolean java.util.List.add(java.lang.Object)' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3449)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7656)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'boolean java.util.List.add(java.lang.Object)' on a null object reference
at android.os.Parcel.readListInternal(Parcel.java:3632)
at android.os.Parcel.readList(Parcel.java:2559)
at com.codinginflow.exampleparcelable.ExampleItem.<init>(ExampleItem.java:26)
at com.codinginflow.exampleparcelable.ExampleItem$1.createFromParcel(ExampleItem.java:32)
at com.codinginflow.exampleparcelable.ExampleItem$1.createFromParcel(ExampleItem.java:29)
at android.os.Parcel.readParcelable(Parcel.java:3281)
at android.os.Parcel.readValue(Parcel.java:3174)
at android.os.Parcel.readListInternal(Parcel.java:3630)
at android.os.Parcel.readArrayList(Parcel.java:2758)
at android.os.Parcel.readValue(Parcel.java:3195)
at android.os.Parcel.readArrayMapInternal(Parcel.java:3567)
at android.os.BaseBundle.initializeFromParcelLocked(BaseBundle.java:292)
at android.os.BaseBundle.unparcel(BaseBundle.java:236)
at android.os.Bundle.getParcelable(Bundle.java:1001)
at android.content.Intent.getParcelableExtra(Intent.java:8276)
at com.codinginflow.exampleparcelable.Activity2.onCreate(Activity2.java:23)
at android.app.Activity.performCreate(Activity.java:8000)
at android.app.Activity.performCreate(Activity.java:7984)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1309)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3422)
First of all, remove white spaces from Example Item You Should pass data like this首先,从示例项目中删除空格你应该像这样传递数据
Add Data添加数据
ArrayList<ExampleItem> mExampleList = new ArrayList<>();
mExampleList.add(new ExampleItem(R.drawable.ic_launcher_background, "Line 1", "Line 2", mBList));
mExampleList.add(new ExampleItem(R.drawable.ic_launcher_foreground, "Line 3", "Line 4", mBList));
mExampleList.add(new ExampleItem(R.drawable.ic_launcher_foreground, "Line 5", "Line 6", mBList));
Send Data发送数据
first, create a bundle and put your items there then pass the bundle to your intent首先,创建一个捆绑包并将您的物品放在那里,然后将捆绑包传递给您的意图
Intent intent = new Intent(FromActivity.this, ToActivity.class);
Bundle bundle;
bundle.putParcelableArrayList("example_item", items);
intent.putExtras(bundle);
Get Data获取数据
ArrayList<ExampleItem> items= intent.getParcelableArrayListExtra("example_item");
EDIT编辑
In my opinion you should Use JsonParsing and then send your data with StringExtra.
在我看来,您应该使用 JsonParsing,然后使用 StringExtra 发送您的数据。
You should implement your pojo item with parcelable
你应该用
parcelable
实现你的pojo项目
look at this example how to pass Array list <Object> to another activity看看这个例子如何将数组列表 <Object> 传递给另一个活动
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.