添加项目到一个ArrayList 已活动之间传递(Add Items to an ArrayL

2019-10-20 14:10发布

我已经在这里看了看四周在计算器上和互联网和尝试了一些事情,但所有的人都让我有相同的一般问题。

我有在一个活动创建,然后通过(另一种活性或2个其他取决于用户的选择),并在每个活动(包括该数组列表中创建的)发送一个ArrayList已经用户从选择单个按钮一个小组。 当选择按钮,我有一个创建一个简单的字符串,然后添加字符串到ArrayList,或者至少,这就是我想要它做一个倾听者。

  1. 我已经尝试使用Serialized类通过所有它需要去通过活动传递同一列表
  2. 我曾尝试让每个类的新的ArrayList,复制从已通过发送前面的类中的一个intent.putExtra()然后接受,因此它可以被复制到一个新的ArrayList做同样的事情,直到它到达最后活动。
  3. 我试图让感Parcleable实现,但它只是似乎想太多,我(我不擅长这个现在)。

所有这些给了我同样NullPointerException每当我尝试和使用.add()中的ArrayList(或方法.addAll()在第二次尝试的条款完成这件事。

与解释沿任何建议,你就必须给初学者将不胜感激! 如果需要的话我可以把代码!

Answer 1:

第一件事情,你应该使用Parcelable ,正是在这种情况下,更有效。 看看这个链接的“为什么”:
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类(ES)和生成(一个Android Studio插件也存在)。

最后,不要忘记,你不能2个活动之间传递无限的数据。 你也可以考虑把你的数据到数据库中。



Answer 2:

我放在一起的数组列表传递到其他活动和添加项目到它的一个简单的例子。

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


Answer 3:

如果你有你想要的活动我个人认为ü让他们作为一个领域的应用对象之间共享一些数据,这样你们就需要扩展应用程序类。

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

在manifest文件中,你将必须配置在应用XML标签应用乌尔班

<application
android:name:"package.name.MyApplication">
</application>

最后,在乌尔活动,你可以通过调用访问它们:

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

这样,你不消耗上串行化/反串行化的资源,你必须在应用程序上下文全球访问。 只是要注意不能矫枉过正这是这些数据将会从任何活​​动独立占用的内存。 但如果打算坚持一些数据,你也会经常从不同的访问,这是一个优化的解决方案比较序列化或通过Parcelable接口。



Answer 4:

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

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


文章来源: Add Items to an ArrayList that has been passed between Activities