将项添加到已在Activities </string>之间传递的ArrayList <string>

时间:2014-07-28 19:25:58

标签: java android android-intent android-activity arraylist

我已经在StackOverflow和互联网上看了一下并试了几件但是所有这些都给了我同样的一般性问题。

我有一个ArrayList,我在一个活动中创建,然后通过(另一个活动或另外两个活动,具体取决于用户选择)发送它,并在每个活动(包括创建arraylist的活动)中让用户选择一个一组中的单个按钮。选择按钮后,我有一个监听器,它创建一个简单的字符串,然后将该String添加到ArrayList,或者至少是我想要它做的。

  1. 我尝试使用Serialized类将相同的列表传递给所需的所有活动
  2. 我尝试在每个类中创建一个新的ArrayList,复制通过intent.putExtra()发送的上一个类中的一个,然后接收,这样就可以将它复制到一个新的arraylist中来做同样的事情直到它进入最后的活动。
  3. 我试图了解Parcleable实施情况,但这对我来说似乎很重要(我现在不擅长这一点)。
  4. 每当我尝试使用ArrayList的NullPointerException方法(或.add())进行第二次尝试时,所有这些都给了我相同的.addAll()

    任何建议以及您必须给予初学者的解释都将不胜感激!如果需要我可以放代码!!

4 个答案:

答案 0 :(得分:3)

首先,您应该使用Parcelable,在这种情况下效率更高。 看看这个链接是什么&#34;:
https://medium.com/@theblackcat102/passing-object-between-activity-using-gson-7dfa11d74e06

其次,我这样做:

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();
    }
}

另外,不要害怕Parcelables!作为一个优秀的开发人员,你应该是懒惰的,然后使用Parcelable生成器,如:
http://www.parcelabler.com/

只需复制您的POJO类并生成(也存在Android Studio插件)。

最后,不要忘记你不能在两个活动之间传递无限数据。您还可以考虑将数据放入数据库中。

答案 1 :(得分:0)

我汇总了一个快速示例,将数组列表传递给其他活动并向其中添加项目。

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);
            }
        }
    }
}

答案 2 :(得分:0)

如果您想要在活动中分享一些数据,我个人建议您将它们作为应用程序对象上的字段保留,因此您需要扩展应用程序类。

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
}
}

在清单文件中,您必须在应用程序xml-tag

中配置应用程序类
<application
android:name:"package.name.MyApplication">
</application>

最后,在您的活动中,您可以通过以下方式访问它们:

((MyApplication)getApplication()).getData();

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

答案 3 :(得分:0)

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

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>());
    }
}

检索:

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();
        }
    }
}