Спиннер.setSelection не вызывает OnItemSelectedListener должным образом
В настоящее время я работаю над деятельностью по управлению учетной записью для моего приложения Android, и у меня возникли проблемы с выяснением, почему setSelection () метод из spinner не вызывает 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 слушатель:
/** 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 моей деятельности, но это не изменило реакцию приложения.
заранее спасибо за любую указатели, помощь или советы !
4 ответов
вы пытались установить счетчик, используя два аргумента, второй с помощью логического:
.setSelection(mProvincesCode.indexOf(mUser.getProvince()), true);
С разработчики это показывает:
setSelection(int position, boolean animate)
//Jump directly to a specific item in the adapter data.
просто используйте следующий код:
ownerSpinnerVw.post(new Runnable() {
@Override
public void run() {
ownerSpinnerVw.setSelection(position);
}
});
Я нашел решение моей проблемы, добавив в метод onCreate. Программа работает, но только для первого выбора. При втором выборе программы происходит сбой эмулятора.
spinner.setOnItemSelectedListener(this);
Я обнаружил, что setSelection (pos) работает, если вы объявите
yourSpinner.setOnItemSelectedListener(null);
до этого.