有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java可分块数组对象列表

我试图将Person对象的ArrayList从MainActivity传递到SecondActivity,以便在自定义listView适配器中打印Person的详细信息

应用程序运行,但在通过人员的ArrayList后到达第二个活动的startActivity()时崩溃

Person实现Parcelable

public Person(String id, String name) {
    this.id = id;
    this.name = name;
}

public Person(Parcel in) {
    id = in.readString();
    name = in.readString();
}

public void writeToParcel(Parcel out, int flags) {
    out.writeString(id);
    out.writeString(name);
}

public static final Parcelable.Creator<Person> CREATOR = new Parcelable.Creator<Person>() 
{
    @Override
    public Person createFromParcel(Parcel in) {
        return new Person(in);
    }

    @Override
    public Person[] newArray(int size) {
        return new Person[size];
 }};

主要活动

List<Person> list = new ArrayList<Person>();

public void onButtonClick() {
    Intent intent = new Intent(getApplicationContext(), SecondActivity.class);
    intent.putExtra("personObject", list);
    startActivity(intent);
}

二等活动

protected void onCreate() {
    Intent i = getIntent();
    ArrayList<Person> person = (ArrayList<Person>) i.getParcelableExtra("personObject");

    //Get the Arraylist of Persons from MainActivity 
    listView.setAdapter(new personAdapter(this, R.layout.person_list_layout, person));

编辑:堆栈错误跟踪

E/AndroidRuntime(16698): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.testApp/com.example.testApp.SecondActivity}: java.lang.NullPointerException
E/AndroidRuntime(16698):    at 安卓.app.ActivityThread.performLaunchActivity(ActivityThread.java:2212)
E/AndroidRuntime(16698):    at 安卓.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2271)
E/AndroidRuntime(16698):    at 安卓.app.ActivityThread.access$800(ActivityThread.java:144)
E/AndroidRuntime(16698):    at 安卓.app.ActivityThread$H.handleMessage(ActivityThread.java:1205)
E/AndroidRuntime(16698):    at 安卓.os.Handler.dispatchMessage(Handler.java:102)
E/AndroidRuntime(16698):    at 安卓.os.Looper.loop(Looper.java:136)
E/AndroidRuntime(16698):    at 安卓.app.ActivityThread.main(ActivityThread.java:5146)
E/AndroidRuntime(16698):    at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(16698):    at java.lang.reflect.Method.invoke(Method.java:515)
E/AndroidRuntime(16698):    at com.安卓.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:732)
E/AndroidRuntime(16698):    at com.安卓.internal.os.ZygoteInit.main(ZygoteInit.java:566)
E/AndroidRuntime(16698):    at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime(16698): Caused by: java.lang.NullPointerException
E/AndroidRuntime(16698):    at com.example.testApp.SecondActivity.onCreate(SecondActivity.java:35)
E/AndroidRuntime(16698):    at 安卓.app.Activity.performCreate(Activity.java:5231)
E/AndroidRuntime(16698):    at 安卓.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
E/AndroidRuntime(16698):    at 安卓.app.ActivityThread.performLaunchActivity(ActivityThread.java:2169)

EDIT2:错误日志第35行

listView.setAdapter(new personAdapter(this, R.layout.person_list_layout, person));

共 (3) 个答案

  1. # 1 楼答案

    你应该使用另一个函数:intent.putParcelableArrayListExtra(String name, ArrayList<? extends Parcelable> value)Google site在main Activity中,然后intent.getParcelableArrayListExtra进入第二个Activity。 希望这有帮助

  2. # 2 楼答案

    ArrayList不实现Parcelable,但它实现了Serializable,因此不能使用getParcelableExtra来接收数据,必须使用getSerializableExtra

    ArrayList<Person> person = (ArrayList<Person>) i.getSerializableExtra("personObject");
    

    Person类也必须实现Serializable,下面是代码示例:

    Person implements Serializable{
       private static final long serialVersionUID = 0L;
       String id;
       String name;
    }
    

    更新:

    另一种解决方案:使用putParcelableArrayListExtragetParcelableArrayListExtra

    第一项活动:

    ArrayList<Person> list = new ArrayList<Person>();
    
    public void onButtonClick() {
        Intent intent = new Intent(getApplicationContext(), SecondActivity.class);
        intent.putParcelableArrayListExtra("personObject", list);
        startActivity(intent);
    }
    

    第二项活动:

    ArrayList<Person> person = (ArrayList<Person>) i.getParcelableArrayListExtra("personObject");
    

    注意:ParcelableSerializable快,所以如果想要传递大量数据,第二种解决方案更好

  3. # 3 楼答案

    一,。用一个按钮创建FirstActivity

    package com.appkart.sdcardconnection;
    
    import java.util.ArrayList;
    
    import android.content.Intent;
    import android.os.Bundle;
    import android.support.v7.app.ActionBarActivity;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    
    public class FirstActivity extends ActionBarActivity {
    
        private Button btn;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.first_activity);
    
            btn = (Button) findViewById(R.id.btn);
            btn.setOnClickListener(new OnClickListener() {
    
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
                    ArrayList<Person> personList = new ArrayList<Person>();
    
                    personList.add(new Person("10", "Arun"));
                    personList.add(new Person("20", "Ankit"));          
    
                    intent.putExtra("person_list", personList);
                    startActivity(intent);              
                }
            });
        }
    }
    

    二,。xml文件

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context="com.appkart.sdcardconnection.FirstActivity" >
    
        <Button
            android:id="@+id/btn"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Second Activity" />
    
    </RelativeLayout>
    

    三,。第二项活动

    package com.appkart.sdcardconnection;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.util.Log;
    
    public class SecondActivity extends Activity {
    
        private static final String TAG = SecondActivity.class.getSimpleName();
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.second_activity);
    
            List<Person> personList = (ArrayList<Person>) getIntent()
                    .getSerializableExtra("person_list");
    
            for (Person person : personList) {
                Log.d(TAG, "id  : " + person.getId());
                Log.d(TAG, "name  : " + person.getName());
    
            }
        }
    }
    

    四,。波乔

    package com.appkart.sdcardconnection;
    
    import java.io.Serializable;
    
    public class Person implements Serializable {
    
        private String id;
        private String name;
    
        public Person(String id, String name) {
            this.id = id;
            this.name = name;
        }
    
        public String getId() {
            return id;
        }
    
        public void setId(String id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
    }
    

    使用Serializable代替Parcelable。根据ArrayList java文档,它实现了可序列化Array list java doc