2012-01-30 9 views
10

Aktualnie pracuję nad działaniem zarządzania kontem w mojej aplikacji na Androida i mam problem z ustaleniem, dlaczego metoda setSelection() od spinnera nie wyzwala OnItemSelectedListener dołączonego do wspomnianego Spinnera .Ustawienie Spinner.setSelection nie uruchamia poprawnie OnItemSelectedListener

Oto, co mam obecnie;

onCreate() metoda:

@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(); 
    } 
} 

Stosowne linie z metodą initializeUI(), która jest wywoływana na tworzenie aktywności, która pokazuje wiązanie Spinner nasłuchiwania:

/** 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 ...    
     } 
    }); 

i ponownie kolejne linie para, tym razem z metody 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())); 

Więc z jes s Oczekuję wywołania OnItemSelectedListener zaraz po ustawieniu zaznaczenia w metodzie fillUI(), ale to nie dzieje się w czasie wykonywania: S

Oto mój wyciąg z LogCat, który pokazuje, że odbiornik nie jest wywoływany, gdy Wybór dotyczy przędzarki krajowej:

I/ManageAccountActivity (28108): Ustawianie kraju na podstawie informacji o użytkowniku.

I/ManageAccountActivity (28108): Ustawianie prowincji na podstawie informacji o użytkowniku.

I/ManageAccountActivity (28108): onCountrySelected() została wywołana, pozycja: 1

W ramach eksperymentu, próbowałem również umieszczenie fillUI() wywołanie w metodzie onStart mojej działalności ale wstałem • zmienić sposób reakcji aplikacji.

Z góry dziękuję za wszelkie wskazówki, pomoc lub wskazówki!

+0

, OnItemSelectedListener jest uruchamiany tylko wtedy, gdy wykonujesz jakąś akcję na spinner..do zmiany –

+1

Cóż, ja to zmienię ... przesunięcie zaznaczenia z 0 na 1 nie byłoby uznane za zmienione? –

Odpowiedz

19

Próbowałeś ustawić pokrętła za pomocą dwóch argumentów, drugi przy użyciu logiczną:

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

Z developers page to pokazuje:

setSelection(int position, boolean animate) 
//Jump directly to a specific item in the adapter data. 
+0

Próbowałem go z argumentem animate jest false (otrzymałem go z innego wątku) Spróbuję go z argumentem jest ustawiona na true. –

+3

Cóż, dziękuję bardzo, powinienem był spróbować ustawić go na prawdziwą w pierwszej kolejności: P. Ustawienie obu spluwaczy na setSelection (pos, true) dało podstęp. –

+0

Niepoprawny, ustawienie parametru "animate" NIE jest połączone z odpalaniem OnItemSelectedListener. –

3

Wystarczy użyć następującego kodu:

ownerSpinnerVw.post(new Runnable() { 
     @Override 
     public void run() { 
      ownerSpinnerVw.setSelection(position); 
     } 
    }); 
0

Znalazłem rozwiązanie mojego problemu dodając to do metody onCreate. Program działa, ale tylko dla pierwszego wyboru. Za drugim razem wybieram program powodujący awarię emulatora.

spinner.setOnItemSelectedListener(this); 

enter image description here

+0

Jak wspomniano w swoim poście. Ta odpowiedź nie działa. Dodaj go jako komentarz. – Arashsoft

0

znalazłem że setSelection (poz) działa jeśli deklarują

yourSpinner.setOnItemSelectedListener(null); 

wcześniej.

Powiązane problemy