Передать ArrayList из одной activity в другую

Мне нужно передать ArrayList из одной Activity в другую. Как правильно это сделать?

public class MainActivity extends AppCompatActivity {

    private ArrayList<MyObj> myObj = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_layout);

        for(int i = 0; i < 10; i++){
            myObj.add(new MyObj("qwe", "asd" + String.valueOf(i)));
        }

        Intent intent = new Intent(this, MainActivity2.class);
        intent.putExtra("Name", "Some Name");
        // Как передать ArrayList<MyObj> ??
        //intent.putExtra("ArrayListMyObj", "HZ");
        startActivity(intent);
   }
 }


public class MyObj {
    String str1;
    String str2;

    public tmpFilter(String str1, String str2) {
        this.str1= str1;
        this.str2= str2;
    }

    public String getStr1() {
        return str1;
    }

    public void setStr1(String str1) {
        this.str1 = str1;
    }

    public String getStr2() {
        return str2;
    }

    public void setStr2(String str2) {
        this.str2 = str2;
    }
}


public class MainActivity2 extends AppCompatActivity {

    private ArrayList<MyObj> myObj = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_layout2);

        Intent intent = getIntent();
        String Name = intent.getStringExtra("Name");
        // Как получить ArrayList<MyObj> ??
   }
 }

Ответы (2 шт):

Автор решения: Andrew

Я бы советовал не использовать данный способ, так как у Bundle есть некоторое ограничение по размеру данных для передачи. Лучше будет использовать отдельный класс где будет сеттится данный массив. Такой паттерн называется синглтоном, создаем класс:

public class Single {

    private Single(){}

    public static Single getInstance(){
        return new Single();
    }
}

добавляем в него поле вашего массива:

ArrayList<MyObj> myObj = new ArrayList<>();

в активности откуда вы хотите его отправить сеттим данные в массив:

Single().getInstance().myObj.add(...) 

Получается эти строки в активности можно убрать:

private ArrayList<MyObj> myObj = new ArrayList<>();

так как вы этот массив уже объявили в другом классе. Так же можно сделать таким образом:

private ArrayList<MyObj> array = new ArrayList<>();
...

for(int i = 0; i < 10; i++){
        array.add(new MyObj("qwe", "asd" + String.valueOf(i)));
}

Single().getInstance().myObj.addAll(array)

дальше у вас есть теперь массив который живет отдельно от активности. После этого в принимающей активности берем данные из массива:

Single().getInstance().myObj

так же можно немного подправить ваш код:

for(int i = 0; i < 10; i++){
    myObj.add(new MyObj("qwe", "asd" + String.valueOf(i)));
    if(myObj.size()==10){
       Intent intent = new Intent(this, MainActivity2.class);
        intent.putExtra("Name", "Some Name");
        startActivity(intent);
        break;
    }
}

Туториалы по работе с синглтонами: 1, 2 и 3.

→ Ссылка
Автор решения: Ilnar

У Bundle есть ограничение ~1 мб данных. Если в коллекции всегда будет меньше данных то можно использовать Serializable или Parcelable для передачи данных через Bundle.

Если данных будет больше, то лучше где-то сохранять данные и считывать их в другом Activity.

Вариант с сохранением данных в синглетон самый простой, но не самый хороший. (Даже плохой, т.к. где-то что-то забудете обнулить и вот утечка памяти, а также при восстановлении activity синглетон будет уже пустым(а вы пытаетесь взять оттуда данные) - это когда система полностью выгружает приложение из памяти, а потом восстанавливает его: свернул/развернул)

Использовать все таки можно и синглетон, но нужно использовать правильно.

→ Ссылка