Имеется некоторый класс, например
public class People{
public int id;
public String name;
public People(int id, String name){
this.id = id;
this.name = name;
}
}
В различных частях приложения (Activity или Fragment) создаются экземпляры класса
Нужно, чтобы из определенной части приложения я мог получить доступ к списку экземпляров класса.
Да их можно передавать с помощью Bundle, но пользователь может не сразу перейти к странице, где этот список необходим. Как можно это реализовать?
Upd:
public class ObjectBasket {
private static ObjectBasket objectBasket;
private ArrayList<Object> objects;
public ObjectBasket(){
objects = new ArrayList<>();
}
public ArrayList<Object> getObjects(){
return objects;
}
public void addObject(Object object){
objects.add(object);
}
}
Все зависит от ваших задач и от того, добавляются ли объекты динамически или заданы сразу. Теоретически, если вы будете добавлять объекты "по ходу пьесы", даже контекст в конструктор передавать не надо.
Одна вещь в конструкторе понадобится точно objects = new ArrayList<>();
.
this.ctx = ctx;
делать нельзя. Так как в статических переменных это сразу утечка памяти. Лучше передавать его в функции, если он там вам потребуется.
Также необходимо добавить следующую переменную и метод:
private static ObjectBasket objectBasket;
public static ObjectBasket get(Context ctx){
if (objectBasket == null) objectBasket = new ObjectBasket(Context ctx);
return objectBasket;
}
Далее, вариант №1, элементы заданы сразу:
public ObjectBasket(Context ctx){
objects = new ArrayList<>();
Resources res = ctx.getResources();
String names = res.getStringArray(R.array.names);
for (int i=0;i<names.lenght;i++){
People people = new People();
people.setName(names[i]);
...// наполнение другими данными, например, из массивов
objects.add(people);
}
}
Вариант №2, динамическое добавление:
public ObjectBasket(){
objects = new ArrayList<>();
}
public void addPeople(String name && другие параметры||People people) {
objects.add(people);
//или
People people = new People();
people.setName(name);
...// наполнение другими данными
objects.add(people);
}
Получать:
public Object getObject(int position) {
if (position>=objects.size()) return null; //или new People(-1,"Ноунэйм");
return objects.get(position);
}
Вызывать из любого места:
ObjectBasket.get(context).getObject(position);
В этом же классе можно хранить любые переменные, доступ к которым нужен из нескольких мест. Например: boolean fullVersion
, boolean soundOn
, boolean gameState
и т.д. и вызывать/устанавливать их через get
и set
методы:
ObjectBasket.get(context).setFullVersion(true);
//или
if (ObjectBasket.get(context).isSoundOn()){...};
Если у вас несколько разнородных объектов, можно создать ArrayList
и соответствующие методы для каждого из них. Это сэкономит память - с Objects
она будет занята больше (постоянно приводить Object
к нужным типам).
Учебник, откуда взято.
А вообще, такой паттерн программирования называется MVC, погуглите если интересно.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Необходимо по нажатию на элемент, открыть AlertDialog и передать в него объектНе видео метод getLayoutInflater
Всем привет, знаю, что уже очень много вопросов на эту тему, однако, как грамотно использовать Android storage access frameworkВот примерно такой: