Android Spinner: Evitar las llamadas onItemSelected durante la inicialización

TextView aplicación de Android con un Spinner y un TextView . Mi tarea es mostrar el elemento seleccionado en la lista desplegable del Spinner en TextView. He implementado Spinner en el método onCreate , así que cuando estoy ejecutando el programa, muestra un valor en el TextView (antes de seleccionar un elemento de la lista desplegable).

Quiero mostrar el valor en TextView sólo después de seleccionar un elemento de la lista desplegable. ¿Cómo hago esto?

Aquí está mi código:

 import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemSelectedListener; import android.widget.ArrayAdapter; import android.widget.Spinner; import android.widget.TextView; public class GPACal01Activity extends Activity implements OnItemSelectedListener { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Spinner spinner = (Spinner) findViewById(R.id.noOfSubjects); // Create an ArrayAdapter using the string array and a default spinner layout ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,R.array.noofsubjects_array, android.R.layout.simple_spinner_item); // Specify the layout to use when the list of choices appears adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); // Apply the adapter to the spinner spinner.setAdapter(adapter); spinner.setOnItemSelectedListener(this); } public void onItemSelected(AdapterView<?> parent, View arg1, int pos,long id) { TextView textView = (TextView) findViewById(R.id.textView1); String str = (String) parent.getItemAtPosition(pos); textView.setText(str); } public void onNothingSelected(AdapterView<?> arg0) { // TODO Auto-generated method stub } } 

 spinner.setOnItemSelectedListener(this); // Will call onItemSelected() Listener. 

Así que la primera vez manejar esto con cualquier valor entero

Ejemplo: Inicialmente Tome int check = 0;

 public void onItemSelected(AdapterView<?> parent, View arg1, int pos,long id) { if(++check > 1) { TextView textView = (TextView) findViewById(R.id.textView1); String str = (String) parent.getItemAtPosition(pos); textView.setText(str); } } 

Puede hacerlo con un valor booleano y también verificando las posiciones actuales y anteriores. Mira aquí

Comenzando con el nivel 3 de API, puede usar onUserInteraction () en una actividad con un booleano para determinar si el usuario está interactuando con el dispositivo.

http://developer.android.com/reference/android/app/Activity.html#onUserInteraction ()

 @Override public void onUserInteraction() { super.onUserInteraction(); userIsInteracting = true; } 

Como un campo en la Actividad que tengo:

  private boolean userIsInteracting; 

Finalmente, mi hiladora:

  mSpinnerView.setOnItemSelectedListener(new OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> arg0, View view, int position, long arg3) { spinnerAdapter.setmPreviousSelectedIndex(position); if (userIsInteracting) { updateGUI(); } } @Override public void onNothingSelected(AdapterView<?> arg0) { } }); 

Al ir y venir a través de la actividad el booleano se restablece a falso. Funciona de maravilla.

Jaja … Tengo la misma pregunta. Cuando initViews () acaba de hacer como esta. La secuencia es la clave, el oyente es el último. Buena suerte !

 spinner.setAdapter(adapter); spinner.setSelection(position); spinner.setOnItemSelectedListener(listener); 

Mi solución:

 protected boolean inhibit_spinner = true; @Override public void onItemSelected(AdapterView<?> arg0, View arg1, int pos, long arg3) { if (inhibit_spinner) { inhibit_spinner = false; }else { if (getDataTask != null) getDataTask.cancel(true); updateData(); } } 

Sólo tiene que poner esta línea antes de establecer OnItemSelectedListener

 spinner.setSelection(0,false) 

Puede hacerlo de esta manera:

 AdapterView.OnItemSelectedListener listener = new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) { //set the text of TextView } @Override public void onNothingSelected(AdapterView<?> adapterView) { } }); yourSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) { yourSpinner.setOnItemSelectedListener(listener); } @Override public void onNothingSelected(AdapterView<?> adapterView) { } }); 

Al principio creo un oyente y se atribuye a una variable de devolución de llamada; Entonces creo un segundo oyente anónimo y cuando esto se llama en una primera vez, esto cambia el listener =]

Una solución simple similar que permite múltiples spinners es poner el AdapterView en una colección – en la superclase Actividades – en la primera ejecución de onItemSelected (…) A continuación, compruebe si la AdapterView está en la colección antes de ejecutarla. Esto permite un conjunto de métodos en la superclase y soporta múltiples AdapterViews y, por lo tanto, múltiples hilanderos.

Superclase …

 private Collection<AdapterView> AdapterViewCollection = new ArrayList<AdapterView>(); protected boolean firstTimeThrough(AdapterView parent) { boolean firstTimeThrough = ! AdapterViewCollection.contains(parent); if (firstTimeThrough) { AdapterViewCollection.add(parent); } return firstTimeThrough; } 

Subclase …

 public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) { if (! firstTimeThrough(parent)) { String value = safeString(parent.getItemAtPosition(pos).toString()); String extraMessage = EXTRA_MESSAGE; Intent sharedPreferencesDisplayIntent = new Intent(SharedPreferencesSelectionActivity.this,SharedPreferencesDisplayActivity.class); sharedPreferencesDisplayIntent.putExtra(extraMessage,value); startActivity(sharedPreferencesDisplayIntent); } // don't execute the above code if its the first time through // do to onItemSelected being called during view initialization. 

}

Esto funcionó para mí

La inicialización de Spinner en Android es problemática a veces el problema anterior fue resuelto por este patrón.

 Spinner.setAdapter(); Spinner.setSelected(false); // must Spinner.setSelection(0,true); //must Spinner.setonItemSelectedListener(this); 

El ajuste del adaptador debe ser la primera parte y onItemSelectedListener (este) será el último al inicializar un spinner. Por el patrón por encima de mi OnItemSelected () no se llama durante la inicialización de spinner

Tenía el mismo problema y esto funciona para mí:

Tengo 2 hilanderos y los actualizo durante el init y durante las interacciones con otros controles o después de conseguir datos del servidor.

Aquí está mi plantilla:

 public class MyClass extends <Activity/Fragment/Whatever> implements Spinner.OnItemSelectedListener { private void removeSpinnersListeners() { spn1.setOnItemSelectedListener(null); spn2.setOnItemSelectedListener(null); } private void setSpinnersListeners() { new Handler().postDelayed(new Runnable() { @Override public void run() { spn1.setOnItemSelectedListener(MyClass.this); spn2.setOnItemSelectedListener(MyClass.this); } }, 1); } @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { // Your code here } @Override public void onNothingSelected(AdapterView<?> parent) { } } 

Cuando la clase está iniciando use setSpinnersListeners () en lugar de establecer directamente el listener.

El Runnable evitará que el spinner dispare onItemSelected justo después de que usted establezca sus valores.

Si necesita actualizar el spinner (después de una llamada al servidor, etc.) use removeSpinnersListeners () justo antes de las líneas de actualización y setSpinnersListeners () justo después de las líneas de actualización. Esto evitará que onItemSelected se dispare después de la actualización.

Usted podría lograrlo por setOnTouchListener primero entonces setOnItemSelectedListener en onTouch

 @Override public boolean onTouch(final View view, final MotionEvent event) { view.setOnItemSelectedListener(this) return false; } 

El indicador de interacción del usuario puede establecerse en true en el método onTouch y restablecer en onItemSelected() una vez que se ha manejado el cambio de selección. Yo prefiero esta solución porque el indicador de interacción del usuario se maneja exclusivamente para la hiladora y no para otras vistas de la actividad que pueden afectar al comportamiento deseado.

En codigo:

Crear su oyente para el hilandero:

 public class SpinnerInteractionListener implements AdapterView.OnItemSelectedListener, View.OnTouchListener { boolean userSelect = false; @Override public boolean onTouch(View v, MotionEvent event) { userSelect = true; return false; } @Override public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) { if (userSelect) { userSelect = false; // Your selection handling code here } } } 

Agregue el listener al spinner como OnItemSelectedListener y OnTouchListener :

 SpinnerInteractionListener listener = new SpinnerInteractionListener(); mSpinnerView.setOnTouchListener(listener); mSpinnerView.setOnItemSelectedListener(listener); 
  • ¿Por qué recibo una respuesta vacía cuando mi aplicación android llama a mi API en mi servidor?
  • Android Spinner con diferentes diseños para "drop down state" y "closed state"?
  • Cambiar Spinner dropdown icon
  • No se puede mostrar la lista de Spinner DropDown dentro de AlertDialog - Android
  • ¿Qué propiedad controla el fondo desplegable de Spinner?
  • Android Spinner con opción múltiple
  • Carga de spinner sqlite con texto y valor
  • La flecha giratoria desaparece cuando cambio el color de fondo
  • Cómo configurar el elemento Spinner sin que onItemSelected se llame
  • ¿Qué tipo de objeto Spinner.getItemAtPosition (...) devuelve?
  • Android spinner onItemSelected llamado varias veces después de la rotación de la pantalla
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.