Как заполнить Spinner Arraylist? - PullRequest
1 голос
/ 01 мая 2019

Я хочу заполнить Spinner ArrayList, но оно повторяет последнее значение для каждого элемента. Как я могу это исправить?

Android screenshot

Как вы можете видеть на скриншоте, он показывает «последний месяц» четыре раза вместо ожидаемых «сегодня», «вчера», «текущий месяц» и «последний месяц».

List<S_lapse> list_lapse = new ArrayList<S_lapse>();
list_lapse.clear();

String myDescription[] = {"Today","Yesterday","Current Month","Last Month"};

S_lapse item2 = new S_lapse();

for (int i = 0; i < myDescription.length; i++) {
    item2.setDescription(myDescription[i]);
    list_lapse.add(item2);
}

/*SPINNER*/

sp2.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            if(position > 0){

            }else{

            }

        }
    });

adapter_period = new Adapter_spinner(getActivity(), list_lapse);
sp2.setAdapter(adapter_period);

Класс S_lapse:

public class S_lapse  {

    private String description;

    public S_lapse(){

    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }
}

1 Ответ

2 голосов
/ 01 мая 2019

Здесь, это происходит, всякий раз, когда вы создаете объект (item2), Java выделяет память в куче для этого конкретного объекта.Теперь, если вы добавите некоторые данные (item2.setDescription(myDescription[i])) java, предоставьте некоторую память для этих данных со ссылкой на ранее определенный объект.Теперь снова, если вы помещаете другие данные в метод setDescription(), вы просто заменяете данные в указанной памяти, а не добавляете их.Вот почему для i=0 описание равно "Today", а для i=1 оно становится "Yesterday".Рассматривайте «предметы» (item2) как здание, а «описание» как отдельную комнату.Если вы не создаете новое здание, вы просто заменяете соседа по комнате, а не добавляете его.

Поэтому замените этот код

S_lapse item2 = new S_lapse();
for (int i = 0; i < myDescription.length; i++) {
    item2.setDescription(myDescription[i]);
    list_lapse.add(item2);
}

на этот

for (int i = 0; i < myDescription.length; i++) {
    S_lapse item2 = new S_lapse();
    item2.setDescription(myDescription[i]);
    list_lapse.add(item2);
}
...