Android обновляет счетчик на основе выбора «Родительского» - .notifyDataSetChange () не запускается? - PullRequest
2 голосов
/ 01 августа 2011

Итак, у меня есть два счетчика, давайте назовем первый счетчик Parent (account_type_spinner) и второй счетчик Child (account_name_spinner).Обратите внимание, что в следующем коде инициализация ArrayAdapter для дочернего элемента (account_name_spinner), я передаю ему массив строк с именами учетных записей, которые я ранее запрашивал перед следующими строками кода (account_name_array):родительский счетчик запускает мой «SpinnerSelectionListener», который просто является моим классом, реализующим OnItemSelectedListener.Этот класс запускается, очевидно, каждый раз, когда выбор делается в спиннере Parent, и код выглядит следующим образом:

public class SpinnerSelectionListener implements OnItemSelectedListener {

    public void onItemSelected(AdapterView<?> parent,
        View view, int pos, long id) {          
        String spinner_selection = parent.getItemAtPosition(pos).toString();

        if(spinner_selection.contentEquals(INCOME)) {               
            //---grab Income type accounts from db and build array---               
            db.open();
            account_name_array = db.getAccounts(INCOME);    
            account_name_adapter.notifyDataSetChanged();

            dr_amount_textview.setVisibility(View.GONE);
            dr_amount.setVisibility(View.GONE);
            cr_amount_textview.setVisibility(View.VISIBLE);
            cr_amount.setVisibility(View.VISIBLE);
            db.close();
        } else {
            //---grab Expense type accounts from db and build array---
            db.open();
            account_name_array = db.getAccounts(EXPENSE);
            account_name_adapter.notifyDataSetChanged();

            cr_amount_textview.setVisibility(View.GONE);
            cr_amount.setVisibility(View.GONE);
            dr_amount_textview.setVisibility(View.VISIBLE);
            dr_amount.setVisibility(View.VISIBLE);
            db.close();
        }
    }

    public void onNothingSelected(AdapterView<?> parent) {
      // Do nothing.
    }
}

Приведенный выше код должен обновлять Child (account_name_spinner) учетными записями INCOME или EXPENSE при каждом выборе Parentизменяется с ДОХОДА на РАСХОД или наоборот (это приложение для учета).Обновление списка счетчиков Child должно быть облегчено с помощью "account_name_adapter.notifyDataSetChanged ();"однако ничего не происходит.

Я рассмотрел эту проблему далее в StackOverflow и обнаружил, что должен обновить элементы .clear () или .remove () из ArrayAdapter моего ребенка (account_name_adapter), прежде чем список обновится, однако, когдаЯ пытаюсь "account_name_adapter.clear ();"перед уведомлением ArrayAdapter я получаю сообщение об ошибке, что операция недопустима.Есть идеи, что я делаю не так?

1 Ответ

1 голос
/ 01 августа 2011

Вы можете просто переназначить адаптер после получения обновленного массива (account_name_array)

account_name_adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, account_name_array);
account_name_adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
account_name_spinner.setAdapter(account_name_adapter);

РЕДАКТИРОВАТЬ: для адаптера вы не передаете ссылку, поэтому при обновлении массива у адаптера все еще естьодни и те же данные.Вызов .notifyDataSetChanged () не обновляет адаптер новым массивом.

...