简体   繁体   English

通过 Parcelable 发送嵌套的 ArrayList 时出现 NullPointerException

[英]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.

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