setonitemselectedlistener seleccionado item eventos arrayadapter android events spinner

seleccionado - spinner android



Spinner de Android: obtenga el evento de cambio de elemento seleccionado (14)

¿Cómo puede configurar el detector de eventos para un Spinner cuando cambia el elemento seleccionado?

Básicamente, lo que estoy tratando de hacer es algo similar a esto:

spinner1.onSelectionChange = handleSelectionChange; void handleSelectionChange(Object sender){ //handle event }


Algunas de las respuestas anteriores no son correctas. Funcionan para otros widgets y vistas, pero la documentación del widget Spinner establece claramente:

Un girador no admite eventos de clic de elementos. Llamar a este método provocará una excepción.

Mejor uso OnItemSelectedListener() lugar de:

spinner.setOnItemSelectedListener(new OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) { // your code here } @Override public void onNothingSelected(AdapterView<?> parentView) { // your code here } });

Esto funciona para mi

Tenga en cuenta que el método onItemSelected también se invoca cuando se está construyendo la vista, por lo que puede considerar ponerlo dentro de la llamada al método onCreate() .


Brillante lo anterior por Stefan Klumpp también me ayudó mucho. Gracias. Soy un novato y los "@Override" s en él causaron un error sobre "debe anular un método de Super clase del mismo nombre". Eclipse sugirió que debería eliminar las Anulaciones. Cuando hice esto, funcionó. Por favor, no me preguntes cómo o por qué.


Encuentra el nombre de tu hilandero y la identificación, luego implementa este método.

spinnername.setOnItemSelectedListener(new OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) { // your code here } @Override public void onNothingSelected(AdapterView<?> parentView) { // your code here } });


La documentación para el widget de giro dice: "Un girador no admite eventos de clic de elementos". Debe usar "setOnItemSelectedListener" para manejar su problema


La mejor forma en que creo que sería tener un flagitemselected = 0; en oncreate. Y en el ítem seleccionado el incremento de evento ese indicador es decir, flagitemselected ++; y luego verifique si (flagitemselected! = 1) {// haga su trabajo aquí}. Esto lo ayudará, supongo


No importa si configurará OnItemSelectedListener en onCreate o onStart; aún se llamará durante la creación o el inicio de la actividad (respectivamente).
Así que podemos configurarlo en onCreate (y NO en onStart!).
Solo agregue una bandera para averiguar la primera inicialización:

private Spinner mSpinner; private boolean mSpinnerInitialized;

luego en onCreate (o onCreateView) solo:

mSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) { if (!mSpinnerInitialized) { mSpinnerInitialized = true; return; } // do stuff } public void onNothingSelected(AdapterView<?> adapterView) { return; } });


Puede implementar la clase AdapterView.OnItemSelectedListener en su Actividad.

Y luego use la línea de abajo en onCreate()

Spinner spin = (Spinner) findViewById(R.id.spinner); spin.setOnItemSelectedListener(this);

Luego anula estos dos métodos:

public void onItemSelected(AdapterView<?> parent, View v, int position, long id) { selection.setText(items[position]); } public void onNothingSelected(AdapterView<?> parent) { selection.setText(""); }


Si quieres un verdadero onChangedListener (). Almacene el valor inicial en el controlador y verifique si ha cambiado. Es simple y no requiere una variable global. Funciona si tienes más de un spinner en la página.

String initialValue = // get from Database or your object mySpinner.setOnItemSelectedListener(new SpinnerSelectedListener(initialValue));

...

protected class SpinnerSelectedListener implements AdapterView.OnItemSelectedListener { private SpinnerSelectedListener() { super(); } public SpinnerSelectedListener(String initialValue) { this(); this.initialValue = initialValue; } private String initialValue; // getter and setter removed. @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { final String newValue = (String) spinHeight.getItemAtPosition(position); if (newValue.equals(initialValue) == false) { // Add your code here. The spinner has changed value. // Maybe useful. // initialValue = newValue; } } @Override public void onNothingSelected(AdapterView<?> parent) { // Maybe useful. // initialValue = null; } }

Los objetos son tus amigos, úsalos.


Un truco que encontré fue poner tus setOnItemSelectedListeners en onWindowFocusChanged en lugar de onCreate. Todavía no he encontrado ningún efecto secundario malo al hacerlo de esta manera. Básicamente, configure los oyentes después de que la ventana se dibuje. No estoy seguro de la frecuencia con la que se ejecuta onWindowFocusChanged, pero es muy fácil crear una variable de bloqueo si la encuentra ejecutándose con demasiada frecuencia.

Creo que Android podría estar usando un sistema de procesamiento basado en mensajes, y si lo pones todo en onCreate, es posible que te encuentres en situaciones en las que la ruleta se rellena después de que se dibuja. Por lo tanto, su oyente se activará después de establecer la ubicación del elemento. Esta es una suposición educada, por supuesto, pero siéntase libre de corregirme al respecto.


tomar una variable global para la selección actual de spinner:

int currentItem = 0; spinner_counter = (Spinner)findViewById(R.id.spinner_counter); String[] value={"20","40","60","80","100","All"}; aa=new ArrayAdapter<String>(this,R.layout.spinner_item_profile,value); aa.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinner_counter.setAdapter(aa); spinner_counter.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { if(currentItem == position){ return; //do nothing } else { TextView spinner_item_text = (TextView) view; //write your code here } currentItem = position; } @Override public void onNothingSelected(AdapterView<?> parent) { } }); //R.layout.spinner_item_profile <?xml version="1.0" encoding="utf-8"?> <TextView android:id="@+id/spinner_item_text" xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/border_close_profile" android:gravity="start" android:textColor="@color/black" android:paddingLeft="5dip" android:paddingStart="5dip" android:paddingTop="12dip" android:paddingBottom="12dip" /> //drawable/border_close_profile <?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item> <shape android:shape="rectangle"> <solid android:color="#e2e3d7" /> </shape> </item> <item android:left="1dp" android:right="1dp" android:top="1dp" android:bottom="1dp"> <shape android:shape="rectangle"> <solid android:color="@color/white_text" /> </shape> </item> </layer-list>


https://.com/q/1714426/811625

Puede evitar que se llame a OnItemSelectedListener () con una simple comprobación: almacene el índice de selección actual en una variable entera y verifique dentro de onItemSelected (..) antes de hacer nada.

P.ej:

Spinner spnLocale; spnLocale = (Spinner)findViewById(R.id.spnLocale); int iCurrentSelection = spnLocale.getSelectedItemPosition(); spnLocale.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) { if (iCurrentSelection != i){ // Your code here } iCurrentSelection = i; } public void onNothingSelected(AdapterView<?> adapterView) { return; } });

Por esta razón, iCurrentSelection debe estar dentro del alcance del objeto para que esto funcione.


Spinner spnLocale = (Spinner)findViewById(R.id.spnLocale); spnLocale.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) { // Your code here } public void onNothingSelected(AdapterView<?> adapterView) { return; } });

Nota: recuerda una cosa.

OnItemSelectedListener evento Spinner OnItemSelectedListener se ejecutará dos veces:

  1. Inicialización de Spinner
  2. Usuario seleccionado manualmente

Intenta diferenciar esos dos usando la variable flag.


spinner.setOnItemSelectedListener( new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) { // TODO Auto-generated method stub } @Override public void onNothingSelected(AdapterView<?> arg0) { // TODO Auto-generated method stub } //add some code here } );


spinner1.setOnItemSelectedListener( new AdapterView.OnItemSelectedListener() { //add some code here } );