2012-01-20 25 views
10

Desidero attivare un evento quando lo stesso articolo è selezionato nella casella di selezione. Metodoevento di fuoco spinner Android quando viene effettuata la stessa selezione articolo

@Override 
    public void onItemSelected(AdapterView<?> parent, View arg1, int position, 
      long arg3) { 
    } 

viene chiamato solo quando viene effettuata una selezione diversa. Il mio scopo è quello di visualizzare un brindisi quando viene selezionata una voce o la stessa voce viene riselezionata o viene fatta una selezione diversa.

@Override 
    public void onNothingSelected(AdapterView<?> parent) { 

    } 

metodo di cui sopra non risolve il mio problema.

+0

Eventuali duplicati di [Come posso ottenere un evento in Android Spinner quando l'elemento selezionato corrente viene selezionato di nuovo?] (Http://stackoverflow.com/questions/5335306/how-can -i-get-un-evento-in-androide-spinner-quando-la-corrente-selezionata-articolo-è-sele) –

risposta

0

uso click ascoltatore a soddisfare le vostre esigenze. poiché il listener di click diretto su spinner non è supportato, fai in modo che una classe estenda il metodo spinner e over ride in click e in questo metodo fai ciò che vuoi fare.

2

è possibile aggiungere un nome di metodo sul vostro elemento selezionato METODO

Spinner `Spinner1`=(Spinner)findViewById(R.id.`declareid`) 

oggetto è stato dichiarato per filatore

@Override 
     public void onItemSelected(AdapterView<?> parent, View arg1, int position, 
       long arg3) 
    { 
    ItemOnChange(); 
     } 

private void ItemOnChange() { 

     if(Spinner1.getSelectedItemPosition()>0){ 
     pd=ProgressDialog.show(this,"","Loading, Please wait .. ",true); 

      final int spinner=Spinner1.getSelectedItemPosition(); 


      final Handler ThreadCallback=new Handler(); 
      final Runnable runInCityThread=new Runnable(){ 
       public void run(){ 
        fnBindspimmer2(); 
        pd.dismiss(); 
       } 

      }; 

      new Thread(){ 
       @Override public void run(){ 

       Spinner2values(); 
       ThreadCallback.post(runInCityThread); 
       } 

      }.start(); 
     } 



} 
18

Ho trovato che la vecchia selezione è mantenuta nella variabile chiamata mOldSelectedPosition nella gerarchia dello spinner. Spinner sta usando questo valore per verificare se lo stesso oggetto selezionato o meno, e se è lo stesso, ignora. Se non vogliamo ignorare questo, quello che ho fatto è un codice sporco che usa la riflessione.

package com.aradiom.amc.nativecomponents; 

import java.lang.reflect.Field; 

import android.content.Context; 
import android.util.Log; 
import android.widget.Spinner; 

public class SpinnerTrigger extends Spinner { 

public SpinnerTrigger(Context context) { 
    super(context); 
    // TODO Auto-generated constructor stub 
} 

@Override 
public void setSelection(int position, boolean animate) { 
    ignoreOldSelectionByReflection(); 
    super.setSelection(position, animate); 
} 

private void ignoreOldSelectionByReflection() { 
    try { 
     Class<?> c = this.getClass().getSuperclass().getSuperclass().getSuperclass(); 
     Field reqField = c.getDeclaredField("mOldSelectedPosition"); 
     reqField.setAccessible(true); 
     reqField.setInt(this, -1); 
    } catch (Exception e) { 
     Log.d("Exception Private", "ex", e); 
     // TODO: handle exception 
    } 
} 

@Override 
public void setSelection(int position) { 
    ignoreOldSelectionByReflection(); 
    super.setSelection(position); 
} 

} 

Questa classe invalida sempre il valore di selezione precedente, in modo che ogni volta che viene attivato l'evento di clic. Potrebbe non essere la soluzione perfetta. Usare con cautela. :)

+0

Ottima soluzione! Ho cercato di rompere questo per ore. Grazie! – nathanielwolf

+0

Buono. Grazie, ha risolto il mio problema. –

3

Poiché la mia reputazione non è abbastanza alta per commentare direttamente la risposta di @Suat, ho provato questo metodo, funziona come un fascino, ma non sono chiaro quali potrebbero essere gli effetti collaterali. Qualcosa che voglio aggiungere è, aggiungere ulteriori costruttori per evitare errori.

public SpinnerTrigger(Context context, AttributeSet attrs, int defStyle) 
{ super(context, attrs, defStyle); } 

public SpinnerTrigger(Context context, AttributeSet attrs){ 
super(context,attrs); 

}

6

Speriamo che questo aiuto. Ho provato e funziona

/** Spinner extension that calls onItemSelected even when the selection is the same as its previous value */ 
    public class NDSpinner extends Spinner { 

     public NDSpinner(Context context) 
     { super(context); } 

     public NDSpinner(Context context, AttributeSet attrs) 
     { super(context, attrs); } 

     public NDSpinner(Context context, AttributeSet attrs, int defStyle) 
     { super(context, attrs, defStyle); } 

     @Override public void 
     setSelection(int position, boolean animate) 
     { 
     boolean sameSelected = position == getSelectedItemPosition(); 
     super.setSelection(position, animate); 
     if (sameSelected) { 
      // Spinner does not call the OnItemSelectedListener if the same item is selected, so do it manually now 
      getOnItemSelectedListener().onItemSelected(this, getSelectedView(), position, getSelectedItemId()); 
     } 
     } 

     @Override public void 
     setSelection(int position) 
     { 
     boolean sameSelected = position == getSelectedItemPosition(); 
     super.setSelection(position); 
     if (sameSelected) { 
      // Spinner does not call the OnItemSelectedListener if the same item is selected, so do it manually now 
      getOnItemSelectedListener().onItemSelected(this, getSelectedView(), position, getSelectedItemId()); 
     } 
     } 
    } 
+0

funziona come un fascino su 4.4.2 =) –

Problemi correlati