Android Spinner: verkrijg de geselecteerde itemwijzigingsgebeurtenis

Hoe kun je de gebeurtenislistener voor een Spinner instellen wanneer het geselecteerde item verandert?

In feite is wat ik probeer te doen iets dat lijkt op dit:

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

Antwoord 1, autoriteit 100%

Sommige van de vorige antwoorden zijn niet correct. Ze werken voor andere widgets en weergaven, maar de documentatie voor de Spinner-widgetvermeldt duidelijk:

Een spinner ondersteunt geen itemklik
evenementen. Het aanroepen van deze methode zal verhogen
een uitzondering.

Gebruik in plaats daarvan beter OnItemSelectedListener():

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

Dit werkt voor mij.

Houd er rekening mee dat de methode onItemSelected ook wordt aangeroepen wanneer de view wordt gebouwd, dus u kunt overwegen deze in de methodeaanroep onCreate()te plaatsen.


Antwoord 2, autoriteit 7%

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

Opmerking:onthoud één ding.

Spinner OnItemSelectedListener-gebeurtenis wordt twee keer uitgevoerd:

  1. Initialisatie van spinner
  2. Gebruiker handmatig geselecteerd

Probeer die twee te onderscheiden door de vlagvariabele te gebruiken.


Antwoord 3, autoriteit 3%

U kunt de klasse AdapterView.OnItemSelectedListenerin uw activiteit implementeren.

En gebruik dan de onderstaande regel in onCreate()

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

Overschrijf vervolgens deze twee methoden:

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

Antwoord 4, autoriteit 2%

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

U kunt voorkomen dat de OnItemSelectedListener() wordt aangeroepen met een eenvoudige controle: Sla de huidige selectie-index op in een integer-variabele en controleer deze in de onItemSelected(..) voordat u iets doet.

Bijvoorbeeld:

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

Natuurlijk zou de iCurrentSelectionbinnen het objectbereik moeten zijn om dit te laten werken!


Antwoord 5

Zoek uw spinner naam en zoek id en implementeer deze methode.

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

Antwoord 6

Het maakt niet uit, kunt u onitemselectionlistener in oncreate of onstart instellen – het zal nog steeds worden genoemd tijdens het maken van activiteiten of start (respectievelijk).
Dus we kunnen het in oncreëren (en niet in onstart!).
Voeg gewoon een vlag toe om Eerste initialisatie te achterhalen:

private Spinner mSpinner;
private boolean mSpinnerInitialized;

Dan in oncreate (of oncreateview), alleen:

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

Antwoord 7

De DOCS voor de spinner-widget zegt

Een spinner ondersteunt geen artikel klik op gebeurtenissen.

U moet setOnItemSelectedListenergebruiken om uw probleem aan te pakken.


Antwoord 8

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

Antwoord 9

Voor KOTLIN kunt u gebruiken:

spinner.onItemSelectedListener =  object : AdapterView.OnItemSelectedListener {
    override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
    }
    override fun onNothingSelected(p0: AdapterView<*>?) {
    }
}

Opmerking: voor parameters van onItemSelectedmethode ik gebruik aangepaste variabele namen


Antwoord 10

Neem een ​​globale variabele voor de huidige selectie van 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>

Antwoord 11

Als je een echte onChangedListener() wilt. Sla de beginwaarde op in de handler en controleer of deze is gewijzigd. Het is eenvoudig en vereist geeneen globale variabele. Werkt als je meer dan één spinner op de pagina hebt.

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; 
        }
    }

Objecten zijn je vriend, gebruik ze.


Antwoord 12

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

Antwoord 13

Dit zal werken
initialiseer de spinner en findviewbyid en gebruik dit en het zal werken

   Spinner schemeStatusSpinner;
  schemeStatusSpinner = (Spinner) dialog.findViewById(R.id.spinner);
schemeStatusSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {
            // your code here
            if(schemeStatusSpinner.getSelectedItemId()==4){
                reasonll.setVisibility(View.VISIBLE);
            }
            else {
                reasonll.setVisibility(View.GONE);
            }
        }
        @Override
        public void onNothingSelected(AdapterView<?> parentView) {
            // your code here
        }
    });

Antwoord 14

Standaard krijg je het eerste item van de spinner-array via

value = spinner.getSelectedItem().toString();

wanneer je de waarde in de spinner hebt geselecteerd, krijg je de geselecteerde waarde

als je de positie van het geselecteerde item wilt, doe het dan zo

pos = spinner.getSelectedItemPosition();

de bovenstaande twee antwoorden zijn voor zonder luisteraar toe te passen


Antwoord 15

De beste manier waarop ik denk dat het zou zijn om een ​​flagitemselected = 0;in onCreate(). En op item geselecteerde gebeurtenisverhoging die vlag I.E flagitemselected++; en controleer dan

if(flagitemselected!=1)
{
// do your work here
}

Hiermee helpt ik het.


Antwoord 16

Eén truc die ik vond, was je setonitemselectionlisteners in Onwindowfocuschanged in plaats van oncreate. Ik heb nog geen slechte bijwerkingen gevonden om het op deze manier te doen. Kortom, de luisteraars opzetten nadat het venster wordt getekend. Ik weet niet zeker hoe vaak onwindowfocuschanged runs, maar het is gemakkelijk genoeg om jezelf een slotvariabele te maken als je het te vaak vindt.

Ik denk dat Android misschien een bericht-gebaseerd verwerkingssysteem gebruikt, en als u het allemaal in oncreate plaatst, kunt u in situaties komen waar de spinner wordt bevolkt nadat deze wordt getekend. Uw luisteraar zal dus afvuren nadat u de locatie van het artikel hebt ingesteld. Dit is natuurlijk een goed opgeleide gok, maar voel je vrij om me hierop te corrigeren.


Antwoord 17

Ik weet dat dit lang was opgelost, maar ik heb een “selecteer” snaar aan de bovenkant van mijn stringarrays. Dan wanneer u de luisteraar schrijft

yourspinner.onItemSelectedListener = object : OnItemSelectedListener {
            override fun onItemSelected(adapterView: AdapterView<*>?, view: View, i: Int, l: Long) {
                yourvalue = yourspinner.getSelectedItem().toString()
                when(yourvalue){
                    "Please Select" -> // DO nothing
                    else -> // Do something
                }
            }
            override fun onNothingSelected(adapterView: AdapterView<*>?) {
                return
            }
        }

U kunt natuurlijk de instelling verlengen wanneer de verklaring verschillende reacties of acties heeft.

Other episodes