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:
- Initialisatie van spinner
- Gebruiker handmatig geselecteerd
Probeer die twee te onderscheiden door de vlagvariabele te gebruiken.
Antwoord 3, autoriteit 3%
U kunt de klasse AdapterView.OnItemSelectedListener
in 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 iCurrentSelection
binnen 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 setOnItemSelectedListener
gebruiken 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 onItemSelected
methode 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.