Как передать ArrayList<ArrayList<CustomObject>> в другую активити?

360
12 мая 2017, 15:04

У меня есть модель:

public class Event {
    private int voltage;
    private Date date;
    public Event(Date date, int voltage){
        this.date = date;
        this.voltage = voltage;
    }
    public int getVoltage() {
        return voltage;
    }
    public void setVoltage(int voltage) {
        this.voltage = voltage;
    }
    public Date getDate() {
        return date;
    }
    public void setDate(Date date) {
        this.date = date;
    }  
}

Из этой модели я создаю списки ArrayList<Event> eventList, все эти списки я помещаю в один большой список - ArrayList<ArrayList<Event>> full_event_list;

Подскажите как правильно передать данную конструкцию в другую активити?

Answer 1

Простой и быстрый по реализации, но медленный в рантайме способ - указать, что класс implements Serializable, после чего передавать его экземпляры через Intent#putSerializable(String key, Serializable value)

Долгий и сложный по реализации, но быстрый в рантайме - указать, что класс implements Parcelable. При этом надо вручную каждое поле сохранять/считывать. Передавать его экземпляры через Intent#putParcelable(String key, Parcelable value).

Для последнего способа есть либа:https://github.com/johncarl81/parceler

Answer 2

Кроме православных методов описанных @ЮрийСПб предложу 2 не очень православных способа:

  1. Засунуть весь ваш массив в JSon строку (легко делается через Google Gson - код буквально в 1 строчку) и отправить как putStringExtra(), на той стороне вытащить и обратно же из Json в ваш объект (опять же не без помощи Google Gson)
  2. Весь ваш массив хранить в классе Application и извлекать оттуда по мере надобности.

P.S. Второй способ совсем не православный :)

Answer 3

Реализую такую (и не только) задачу через "Лабы" (Учебник).

Примерно так:

public class SymbolLab {
    private static SymbolLab symbolLab;      
    private ArrayList<Symbol> symbols;   
public static SymbolLab get(Context ctx) {
    if (symbolLab == null)
        symbolLab = new SymbolLab(ctx);
    return symbolLab;
}
private SymbolLab(Context ctx) {
       создание массива данных
}
public ArrayList<Symbol> getSymbols(){
    return symbols;
}

доступ из любой точки приложения: SymbolLab.get(this/getActivity()).getSymbols()

READ ALSO
Как вытащить картинку из тега

Как вытащить картинку из тега

Пользуюсь JsonParaser, получаю такой объект:

322
Запуск Java кода на сервере [требует правки]

Запуск Java кода на сервере [требует правки]

Есть парсер, написанный на JavaПерептсывать его в php не хочется, можно ли его запустить из php скрипта? Как?

314
Как переключаться между узлами Firebase?

Как переключаться между узлами Firebase?

ЗдравствуйтеНужна помощь

419
Наследование внутренних классов в java

Наследование внутренних классов в java

Объясните кто может, как происходит наследование вложенных non-static классовНа примере следующего кода:

244