简体   繁体   中英

NullPointerException when sending nested ArrayList via Parcelable

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM