Android Spinner - onItemSelected / setOnItemSelectedListener wird nicht ausgelöst


Answers

Denken Sie daran, dass Sie das gleiche Drehfeldelement nicht erneut auswählen können. Es wird immer das erste Element als ausgewählt festgelegt, wenn Sie keinen benutzerdefinierten Code zum Behandeln der Auswahl des Drehfelds hinzufügen.

Damit der Toast nicht angezeigt wird, würde ich vorschlagen, immer "MyActivity.this" als Kontext zu verwenden, wenn Sie einen Toast in einer Listener-Oberfläche wie dieser erstellen:

spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        /**
         * Called when a new item is selected (in the Spinner)
         */
         public void onItemSelected(AdapterView<?> parent, View view, 
                    int pos, long id) {
                // An spinnerItem was selected. You can retrieve the selected item using
                // parent.getItemAtPosition(pos)

                Toast.makeText(MyActivity.this, "Hello Toast",Toast.LENGTH_SHORT).show();

            }

            public void onNothingSelected(AdapterView<?> parent) {
                // Do nothing, just another required interface callback
            }

    }); // (optional)

Und die .show () am Ende ist manchmal leicht zu vergessen;)

Question

Das macht mich verrückt, weil es etwas ist, was ich vorher gemacht habe, aber ich kann nicht herausfinden, warum es jetzt nicht funktioniert ...

Ich habe eine menu.xml , die wie üblich über eine menu.xml Datei und die onOptionsItemSelected Methode mit einem Schalter onOptionsItemSelected ist, der einen Spinner erstellt und anzeigt.

Ich habe den setOnItemSelectedListener hinzugefügt, aber es scheint nie zu triggern. Der Drehknopf erscheint, ich wähle eine Option oder onItemSelected zurück, weder onItemSelected noch onNothingSelected werden aufgerufen.

Hier ist der gesamte Code zwischen "case" und "return true" der Menü-Button-Handling-Schalteranweisung. ( topThis ist eine Variable, die sich auf den Kontext der Aktivität bezieht - funktioniert gut für alle anderen Toasts in der App)

String[] widgetModes = {"Mode 1", "Mode2"};
ArrayAdapter<String> widgetModeAdapter = new ArrayAdapter<String> (this, android.R.layout.simple_spinner_item, widgetModes);
widgetModeAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

Spinner widgetModeSpinner = new Spinner(this);
widgetModeSpinner.setAdapter(widgetModeAdapter);
widgetModeSpinner.setPrompt("Choose Widget Mode");

widgetModeSpinner.setOnItemSelectedListener(new OnItemSelectedListener() 
{
    @Override
    public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) 
    {
        Toast.makeText(topThis, "derp", Toast.LENGTH_LONG).show();
    }

    @Override
    public void onNothingSelected(AdapterView<?> parentView) 
    {
        Toast.makeText(topThis, "herf", Toast.LENGTH_LONG).show();
    }
});

widgetModeSpinner.performClick();

Irgendwelche Ideen? Ich vermute vage, dass die Tatsache, dass ich den Spinner programmatisch erstelle, das Problem ist ...




Ich weiß, dass die Frage ein bisschen alt ist, aber für den Fall, dass Sie auf einen AsyncTask-Callback warten, stellen Sie sicher, dass Sie Ihren Adapter über die Datenänderungen informieren, indem Sie notifyDataSetChanged () auf dem Callback-Thread aufrufen!

@Override
public void onPostExecute(String result) {
   ///do something with your data  
   spinnerArrayAdapter.notifyDataSetChanged();
}