Android доступ к экземплярам класса

172
30 июля 2018, 03:30

Имеется некоторый класс, например

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

}

Answer 1

Все зависит от ваших задач и от того, добавляются ли объекты динамически или заданы сразу. Теоретически, если вы будете добавлять объекты "по ходу пьесы", даже контекст в конструктор передавать не надо.

Одна вещь в конструкторе понадобится точно 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, погуглите если интересно.

READ ALSO
Открытие Alertdialog по нажатию элемента RecyclerView(CardView)

Открытие Alertdialog по нажатию элемента RecyclerView(CardView)

Необходимо по нажатию на элемент, открыть AlertDialog и передать в него объектНе видео метод getLayoutInflater

178
Шаблонизатор Spring

Шаблонизатор Spring

Имеется такая структура - чистые JSP без ничего другого

267
Java. Cмещение битов

Java. Cмещение битов

Код взят отсюда: ссылка

192
Android storage access framework

Android storage access framework

Всем привет, знаю, что уже очень много вопросов на эту тему, однако, как грамотно использовать Android storage access frameworkВот примерно такой:

226