Java 将项目添加到ArrayList<;字符串>;在活动之间传递的信息

Java 将项目添加到ArrayList<;字符串>;在活动之间传递的信息,java,android,android-intent,android-activity,arraylist,Java,Android,Android Intent,Android Activity,Arraylist,我在StackOverflow和internet上四处搜索,并尝试了一些方法,但它们都给了我相同的一般问题 我在一个活动中创建了一个ArrayList,然后通过它发送(另一个活动或两个其他活动,取决于用户的选择),在每个活动(包括创建ArrayList的活动)中,用户从组中选择一个按钮。选择按钮后,我有一个监听器,它创建一个简单的字符串,然后将该字符串添加到ArrayList,或者至少我希望它这样做 我曾尝试使用序列化的类将相同的列表传递给它需要执行的所有活动 我尝试在每个类中创建一个新的Arr

我在StackOverflow和internet上四处搜索,并尝试了一些方法,但它们都给了我相同的一般问题

我在一个活动中创建了一个ArrayList,然后通过它发送(另一个活动或两个其他活动,取决于用户的选择),在每个活动(包括创建ArrayList的活动)中,用户从组中选择一个按钮。选择按钮后,我有一个监听器,它创建一个简单的字符串,然后将该字符串添加到ArrayList,或者至少我希望它这样做

  • 我曾尝试使用
    序列化的
    类将相同的列表传递给它需要执行的所有活动
  • 我尝试在每个类中创建一个新的ArrayList,复制上一个类中通过
    intent.putExtra()
    发送并接收的ArrayList,以便将其复制到一个新的ArrayList中执行相同的操作,直到到达最终活动
  • 我曾试图理解
    Parcleable
    实现,但它似乎对我来说意义重大(我现在不太擅长这一点)
  • 无论何时我尝试使用ArrayList的
    .add()
    方法(或
    .addAll()
    第二次尝试完成此操作),所有这些都给了我相同的
    NullPointerException


    非常感谢您向初学者提供的任何建议和解释!如果需要,我可以编写代码!!

    我提供了一个将数组列表传递给其他活动并向其中添加项目的快速示例

    public class FirstActivity extends Activity {
    
        public static final String EXTRA_FIRST_ARRAY = "ExtraFirstArray";
    
        private static final String TAG = FirstActivity.class.getSimpleName();
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            ArrayList<String> firstArrayList = new ArrayList<String>();
    
            firstArrayList.add("First Activity Test1");
            firstArrayList.add("First Activity Test2");
            firstArrayList.add("First Activity Test3");
    
            Log.d(TAG, "First Array List: ");
    
            for (String value : firstArrayList) {
                Log.d(TAG, "Value: " + value);
            }
    
            Intent intent = new Intent(this, SecondActivity.class);
            intent.putStringArrayListExtra(EXTRA_FIRST_ARRAY, firstArrayList);
            startActivity(intent);
        }
    }
    
    public class SecondActivity extends Activity {
    
        public static final String EXTRA_SECOND_ARRAY = "ExtraSecondArray";
    
        private static final String TAG = SecondActivity.class.getSimpleName();
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            if (getIntent().getExtras() != null) {
    
                final ArrayList<String> firstArrayList = getIntent().getStringArrayListExtra(FirstActivity.EXTRA_FIRST_ARRAY);
    
                ArrayList<String> secondArrayList = new ArrayList<String>();
    
                secondArrayList.addAll(firstArrayList);
    
                secondArrayList.add("Second Activity Test1");
                secondArrayList.add("Second Activity Test2");
                secondArrayList.add("Second Activity Test3");
    
                Log.d(TAG, "Second Array List: ");
    
                for (String value : secondArrayList) {
                    Log.d(TAG, "Value: " + value);
                }
    
                Intent intent = new Intent(this, ThirdActivity.class);
                intent.putStringArrayListExtra(EXTRA_SECOND_ARRAY, secondArrayList);
                startActivity(intent);
            }
        }
    }
    
    public class ThirdActivity extends Activity {
    
        private static final String TAG = ThirdActivity.class.getSimpleName();
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            if (getIntent().getExtras() != null) {
    
                final ArrayList<String> secondArrayList = getIntent().getStringArrayListExtra(SecondActivity.EXTRA_SECOND_ARRAY);
    
                ArrayList<String> thirdArrayList = new ArrayList<String>();
    
                thirdArrayList.addAll(secondArrayList);
    
                thirdArrayList.add("Third Activity Test1");
                thirdArrayList.add("Third Activity Test2");
                thirdArrayList.add("Third Activity Test3");
    
                Log.d(TAG, "Third Array List: ");
    
                for (String value : thirdArrayList) {
                    Log.d(TAG, "Value: " + value);
                }
            }
        }
    }
    
    公共类FirstActivity扩展活动{
    公共静态最终字符串EXTRA\u FIRST\u ARRAY=“ExtraFirstArray”;
    私有静态最终字符串标记=FirstActivity.class.getSimpleName();
    @凌驾
    创建时受保护的void(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    ArrayList firstArrayList=新的ArrayList();
    添加(“第一个活动Test1”);
    添加(“第一个活动Test2”);
    添加(“第一个活动Test3”);
    d(标签,“第一个数组列表:”);
    for(字符串值:firstArrayList){
    Log.d(标签,“值:”+值);
    }
    意向意向=新意向(此,SecondActivity.class);
    putStringArrayListExtra(额外的第一个数组,第一个数组列表);
    星触觉(意向);
    }
    }
    公共类SecondActivity扩展了活动{
    公共静态最终字符串EXTRA\u SECOND\u ARRAY=“extrasondarray”;
    私有静态最终字符串标记=SecondActivity.class.getSimpleName();
    @凌驾
    创建时受保护的void(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    if(getIntent().getExtras()!=null){
    final ArrayList firstArrayList=getIntent().getStringArrayListExtra(FirstActivity.EXTRA\u FIRST\u数组);
    ArrayList secondArrayList=新的ArrayList();
    addAll(firstArrayList);
    添加(“第二个活动测试1”);
    添加(“第二个活动测试2”);
    添加(“第二个活动测试3”);
    d(标签,“第二个数组列表:”);
    for(字符串值:secondArrayList){
    Log.d(标签,“值:”+值);
    }
    意向意向=新意向(this,ThirdActivity.class);
    putStringArrayListExtra(额外的第二个数组,第二个数组列表);
    星触觉(意向);
    }
    }
    }
    公共课第三活动扩展活动{
    私有静态最终字符串标记=ThirdActivity.class.getSimpleName();
    @凌驾
    创建时受保护的void(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    if(getIntent().getExtras()!=null){
    final ArrayList secondArrayList=getIntent().getStringArrayListExtra(SecondActivity.EXTRA_SECOND_数组);
    ArrayList thirdArrayList=新的ArrayList();
    addAll(secondArrayList);
    添加(“第三个活动测试1”);
    添加(“第三个活动测试2”);
    添加(“第三个活动测试3”);
    d(标签,“第三个数组列表:”);
    for(字符串值:thirdArrayList){
    Log.d(标签,“值:”+值);
    }
    }
    }
    }
    
    如果您有一些数据要在活动之间共享,我个人建议您将它们作为应用程序对象上的字段保存,以便您需要扩展应用程序类

    public class MyApplication extend Application{
    
    private List<SomeData> data;
    
    @overrite
    public void onCreate(){
    super.onCreate();
    data = new ArrayList<SomeData>();
    }
    
    public List<SomeData> getData(){
    
    return data
    }
    }
    

    通过这种方式,您不会在序列化/反序列化上消耗资源,并且可以在应用程序上下文中全局访问。只需注意不要过度,因为这些数据将独立于任何活动占用内存。但是,如果您打算保留一些您将经常从不同位置访问的数据,这是一个优化的解决方案与串行化或通过包裹接口相比。

    您还可以使用自定义意图:

    public class SharedIntent extends Intent {
        private List list;
    
        public void putArrayList(List list){
            this.list = list;
        }
    
        public List getList(){
            return list;
        }
    }
    
    发送:

    public class SenderActivity extends Activity {
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            SharedIntent intent = new SharedIntent();
            intent.putArrayList(new ArrayList<String>());
        }
    }
    
    公共类SenderActivity扩展活动{
    创建时的公共void(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    SharedIntent=新的SharedIntent();
    intent.putArrayList(新的ArrayList());
    }
    }
    
    检索:

    public class GettingActivity extends Activity {
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            if (getIntent() instanceof SharedIntent) {
                SharedIntent intent = (SharedIntent) getIntent();
                ArrayList<String> list = (ArrayList<String>) intent.getList();
            }
        }
    }
    
    公共类获取活动扩展了活动{
    创建时的公共void(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    if(getIntent()实例为SharedIntent){
    SharedIntent=(SharedIntent)getIntent();
    ArrayList=(ArrayList)intent.getList();
    }
    }
    }
    
    首先,你应该使用
    包裹,在这种情况下效率更高。
    查看此链接了解“原因”:

    其次,我会这样做:

    public class ActivityOne extends Activity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_one);
            Intent intent = new Intent(this, ActivityTwo.class);
            ArrayList<Person> strings = new ArrayList<Person>(Arrays.asList(new Person("Bob"),new Person("Dude")));
            Bundle bundle = new Bundle();
            bundle.putParcelableArrayList(ActivityTwo.PARCELABLE_KEY,strings);
            intent.putExtras(bundle);
            startActivity(intent);
        }
    }
    
    
    public class ActivityTwo extends Activity {
        public static final String PARCELABLE_KEY = "array_key";
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_two);
            if (getIntent() != null) {
                ArrayList<Person> persons = getIntent().getParcelableArrayListExtra(PARCELABLE_KEY);
                Log.d("test", persons.toString());
            }
        }
    }
    
    public class Person implements Parcelable {
    
        private String name;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Person() {
        }
    
        public Person(String name) {
            this.name = name;
        }
    
    
        @Override
        public int describeContents() {
            return 0;
        }
    
        @Override
        public void writeToParcel(Parcel dest, int flags) {
            dest.writeString(this.name);
        }
    
        public static final Parcelable.Creator<Person> CREATOR = new Parcelable.Creator<Person>() {
            public Person createFromParcel(Parcel source) {
                return new Person(source);
            }
    
            public Person[] newArray(int size) {
                return new Person[size];
            }
        };
    
        private Person(Parcel in) {
            this.name = in.readString();
        }
    }
    
    公共类活动
    
    public class GettingActivity extends Activity {
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            if (getIntent() instanceof SharedIntent) {
                SharedIntent intent = (SharedIntent) getIntent();
                ArrayList<String> list = (ArrayList<String>) intent.getList();
            }
        }
    }
    
    public class ActivityOne extends Activity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_one);
            Intent intent = new Intent(this, ActivityTwo.class);
            ArrayList<Person> strings = new ArrayList<Person>(Arrays.asList(new Person("Bob"),new Person("Dude")));
            Bundle bundle = new Bundle();
            bundle.putParcelableArrayList(ActivityTwo.PARCELABLE_KEY,strings);
            intent.putExtras(bundle);
            startActivity(intent);
        }
    }
    
    
    public class ActivityTwo extends Activity {
        public static final String PARCELABLE_KEY = "array_key";
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_two);
            if (getIntent() != null) {
                ArrayList<Person> persons = getIntent().getParcelableArrayListExtra(PARCELABLE_KEY);
                Log.d("test", persons.toString());
            }
        }
    }
    
    public class Person implements Parcelable {
    
        private String name;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Person() {
        }
    
        public Person(String name) {
            this.name = name;
        }
    
    
        @Override
        public int describeContents() {
            return 0;
        }
    
        @Override
        public void writeToParcel(Parcel dest, int flags) {
            dest.writeString(this.name);
        }
    
        public static final Parcelable.Creator<Person> CREATOR = new Parcelable.Creator<Person>() {
            public Person createFromParcel(Parcel source) {
                return new Person(source);
            }
    
            public Person[] newArray(int size) {
                return new Person[size];
            }
        };
    
        private Person(Parcel in) {
            this.name = in.readString();
        }
    }