Spinner.setSelection не запускает OnItemSelectedListener должным образом - PullRequest
10 голосов
/ 30 января 2012

В настоящее время я работаю над действием по управлению учетными записями для моего приложения Android, и у меня возникают проблемы с выяснением, почему метод setSelection () из счетчика не вызывает OnItemSelectedListener, присоединенный к указанному Spinner.

Вот что у меня сейчас;

Метод onCreate ():

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.account_management);

    this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

    retreiveLanguage();
    initializeUI();

    // Vérification si l'usager est déjà connecté
    Globals appState = ((Globals) this.getApplication());
    boolean userLoggedIn = appState.isUserLoggedIn();
    boolean userInfoAvailable = appState.isUserInfoAvailable();

    if (userLoggedIn && userInfoAvailable) {
      fillUI();
    }
}   

Соответствующие строки из метода initializeUI (), который вызывается при создании действия, которое показывает привязку Spinner a Listener:

    /** OnItemSelectedHandler for the Country Spinner */
    mCountrySpinner.setOnItemSelectedListener(new OnItemSelectedListener() {

        public void onItemSelected(AdapterView<?> parent, View view,
                int pos, long id) {
            Log.i(TAG, "onCountrySelected() was called, position : " + pos);

            mProvinces = new ArrayList<String>();
            mProvincesCode = new ArrayList<String>();

            mXML.parseResponse(FileManager.getInstance().getPortalOptions());

            for (int i = 0; i < mXML.getCountry(pos).sizeProvinces(); i++){
                mProvinces.add(mXML.getCountry(pos).getProvince(i).getLabel(mLanguage));
                mProvincesCode.add(mXML.getCountry(pos).getProvince(i).getCode());
            }

            mProvinceArrayAdapter = new ArrayAdapter<String>(ManageAccountActivity.this, 
                    android.R.layout.simple_spinner_item, mProvinces);
            mProvinceArrayAdapter.setDropDownViewResource(
                    android.R.layout.simple_spinner_dropdown_item);
            mProvinceSpinner.setAdapter(mProvinceArrayAdapter);
        }

        public void onNothingSelected(AdapterView<?> arg0) {
            // Do Nothing ...               
        }
    });

И снова еще пара строк, на этот раз из метода fillUI ():

Log.i(TAG, "Setting country based on user information.");
((Spinner) findViewById(R.id.spin_country))
    .setSelection(mCountriesCode.indexOf(mUser.getCountry()));
// TODO : Fix Provinces and States not being changed accordingly
Log.i(TAG, "Setting province based on user information.");
((Spinner) findViewById(R.id.spin_province))
    .setSelection(mProvincesCode.indexOf(mUser.getProvince())); 

Итак, я ожидал, что OnItemSelectedListener будет вызываться сразу после установки выбора в методе fillUI (), но это не то, что происходит во время выполнения: S

Вот моя выдержка из LogCat, которая показывает, что слушатель не вызывается, когда выбор применяется к счетчику страны:

I / ManageAccountActivity (28108): настройка страны на основе информации пользователя.

I / ManageAccountActivity (28108): настройка провинции на основе информации пользователя.

I / ManageAccountActivity (28108): вызван onCountrySelected (), позиция: 1

В качестве эксперимента я также попытался поместить вызов fillUI () в метод onStart моей Activity, но это не изменило реакцию приложения.

Заранее спасибо за любые указатели, помощь или советы!

Ответы [ 4 ]

23 голосов
/ 30 января 2012

Вы пытались установить счетчик, используя два аргумента, второй - логический:

.setSelection(mProvincesCode.indexOf(mUser.getProvince()), true); 

Со страницы для разработчиков он показывает:

setSelection(int position, boolean animate)
//Jump directly to a specific item in the adapter data.
3 голосов
/ 10 февраля 2016

Просто используйте следующий код:

  ownerSpinnerVw.post(new Runnable() {
        @Override
        public void run() {
             ownerSpinnerVw.setSelection(position);
        }
    });
0 голосов
/ 18 декабря 2017

Я обнаружил, что setSelection (pos) работает, если вы объявите

yourSpinner.setOnItemSelectedListener(null);

до этого.

0 голосов
/ 01 ноября 2016

Я нашел решение моей проблемы, добавив его в метод onCreate. Программа работает, но только для первого выбора. При втором выборе программы вылетает эмулятор.

spinner.setOnItemSelectedListener(this);

enter image description here

...