I am trying to send a nested ArrayList object via Parcelable intent. Name of custom object is 'ExampleItem' which contains nested custom object 'B'. I am sending from MainActivity to Activity2. I get NullPointerException error "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?
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
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.
You should implement your pojo item with parcelable
look at this example how to pass Array list <Object> to another activity
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.