2012-01-30 20 views
10

Actualmente estoy trabajando en una actividad de administración de cuentas para mi aplicación de Android y estoy teniendo problemas para averiguar por qué el método setSelection() de una ruleta no activa el OnItemSelectedListener conectado a dicho Spinner .Spinner.setSelection no desencadena correctamente OnItemSelectedListener

Esto es lo que tengo actualmente;

onCreate) método (:

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

líneas pertinentes desde el método initializeUI() que se llama en la creación de la actividad que muestra la unión del hilandero del Oyente:

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

Y de nuevo otro par de líneas, esta vez desde el método 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())); 

Así que con thi s Esperaría que se llamara OnItemSelectedListener justo después de establecer la selección en el método fillUI(), pero eso no es lo que está sucediendo en tiempo de ejecución: S

Aquí está mi extracto de LogCat que muestra que no se llama al Listener cuando la selección se aplica al girador de país:

I/ManageAccountActivity (28108): país de configuración según la información del usuario.

I/ManageAccountActivity (28108): configuración de provincia según la información del usuario.

I/ManageAccountActivity (28108): onCountrySelected() fue llamado, la posición: 1

Como experimento, también traté de poner la llamada fillUI() en el método onStart de mi actividad, pero que didn' t cambiar cómo reaccionó la aplicación.

¡Gracias de antemano por cualquier consejo, ayuda o consejo!

+0

, OnItemSelectedListener se activa solo cuando se hace alguna acción en la rueda giratoria ... para cambiar –

+1

Bueno, sí lo cambio ... mover la selección de 0 a 1 ¿no se consideraría cambiado? –

Respuesta

19

¿Ha intentado ajustar el control de giro mediante el uso de dos argumentos, el segundo utilizando un valor lógico:

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

Desde el developers page muestra:

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

Lo he intentado con el argumento animado siendo falso (lo obtuve de otro hilo) Lo intentaré con el argumento establecido en verdadero. –

+3

Bueno, muchas gracias, debería haber intentado establecerlo en verdad en primer lugar: P. Establecer los dos giradores para setSelection (pos, true) hizo el truco. –

+0

Incorrecto, configurar el parámetro 'animado' NO está conectado con el encendido OnItemSelectedListener. –

3

sólo tiene que utilizar el siguiente código:

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

Encontré la solución a mi problema al agregar esto al método onCreate. El programa funciona pero solo para la primera selección. La segunda vez que selecciono el programa, falla el emulador.

spinner.setOnItemSelectedListener(this); 

enter image description here

+0

Como mencionaste en tu publicación. Esta respuesta no está funcionando. Por favor agrégalo como comentario. – Arashsoft

0

encontré que setSelection (pos) funciona si se declara

yourSpinner.setOnItemSelectedListener(null); 

antes de eso.

Cuestiones relacionadas