Спиннер Android не сохраняет значение при изменении активности (связан с жизненным циклом) - PullRequest
2 голосов
/ 22 марта 2011

В моей деятельности у меня есть Spinner и ListView. Spinner используется для фильтрации элементов в ListView. Когда пользователь щелкает элемент списка, вызывается другое действие, которое показывает детали элемента списка. Затем, из операции с деталями, пользователь нажимает кнопку «Назад», и счетчик (таким образом, список) возвращается к своему начальному значению.

Это связано с тем, что я заполняю адаптер счетчика и объявляю его onItemSelectedListener в метод onStart (), который вызывается снова, когда пользователь нажимает кнопку возврата. Также onItemSelectedListener фактически вызывается один раз методом onStart ().

Как мне избежать этого поведения? Думаю, мне следует переместить слушателя и адаптер куда-нибудь еще, но куда?

Вот обзор класса

public static ArrayList<String> years;

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.archive);

    // populate years array here
}

@Override
protected void onStart()
{
    super.onStart();

    Spinner spinner = (Spinner) findViewById(R.id.spinner_anni);

    // create spinner adapter
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
            android.R.layout.simple_spinner_item, ArchiveActivity.years);
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spinner.setAdapter(adapter);

    // create spinner listener
    spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener()
    {
        @Override
        public void onItemSelected(AdapterView<?> parentView,
                View selectedItemView, int position, long id)
        {
            filterList(ArchiveActivity.years.get(position));
        }

        @Override
        public void onNothingSelected(AdapterView<?> parentView)
        {
            return;
        }
    });

    // create list listener
    ListView list = (ListView) findViewById(R.id.list_archive);
    list.setOnItemClickListener(this);
}

private void filterList(String year)
{
    // filter list data here
}

@Override
public void onItemClick(AdapterView<?> list, View item, int pos, long id)
{
    // call detail activity for list item that's been pressed
    Intent i = new Intent(this, DetailActivity.class);
    startActivity(i);
}

Ответы [ 2 ]

2 голосов
/ 22 марта 2011

Обычно вы запускаете счетчик и адаптер в методе onCreate ().Кроме того, вы должны сохранить статус вашего счетчика и воссоздать его, когда активность вернется на передний план.Проверьте этот вопрос о том, как сохранить состояние приложения.

0 голосов
/ 22 марта 2011

Вы можете сохранить состояние своей активности и загрузить его обратно

Взгляните на onSaveInstanceState и onRestoreInstanceState метод

...