Передать 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 шт):
Я бы советовал не использовать данный способ, так как у 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;
}
}
У Bundle есть ограничение ~1 мб данных. Если в коллекции всегда будет меньше данных то можно использовать Serializable или Parcelable для передачи данных через Bundle.
Если данных будет больше, то лучше где-то сохранять данные и считывать их в другом Activity.
Вариант с сохранением данных в синглетон самый простой, но не самый хороший. (Даже плохой, т.к. где-то что-то забудете обнулить и вот утечка памяти, а также при восстановлении activity синглетон будет уже пустым(а вы пытаетесь взять оттуда данные) - это когда система полностью выгружает приложение из памяти, а потом восстанавливает его: свернул/развернул)
Использовать все таки можно и синглетон, но нужно использовать правильно.