web-dev-qa-db-fra.com

Android Spinner - onItemSelected / setOnItemSelectedListener ne se déclenchant pas

Cela me rend fou car c'est quelque chose que j'ai fait auparavant, mais je ne peux pas comprendre pourquoi cela ne fonctionne pas maintenant ...

J'ai un bouton de menu, implémenté de la manière habituelle via un menu.xml file et la méthode onOptionsItemSelected avec un commutateur, qui crée et affiche un spinner.

J'ai ajouté le setOnItemSelectedListener, mais il ne semble jamais se déclencher. Le spinner apparaît, je choisis une option ou je recule, ni onItemSelected ni onNothingSelected ne sont appelés.

Voici tout le code entre "case" et "return true" de l'instruction switch menu-button-handling. (topThis est une variable faisant référence au contexte de l'activité - fonctionne très bien pour tous les autres toasts de l'application)

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

Des idées? Je soupçonne vaguement que le fait que je crée le Spinner par programme est le problème ...

18
Greg

J'ai eu le même problème lorsque j'implémentais un spinner, je l'ai résolu en obtenant la vue parent et en définissant l'adaptateur-

spinner1 =(Spinner)findViewById(R.id.spinner1);
spinner1.setAdapter(BindSpinner("ProgramMaster",cols,null,true,""));
spinner1.setOnItemSelectedListener(new OnItemSelectedListener() 
{
protected Adapter initializedAdapter=null;
    @Override
    public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) 
    {
        if(initializedAdapter !=parentView.getAdapter() ) {
            initializedAdapter = parentView.getAdapter();
           return;
        }

        String selected = parentView.getItemAtPosition(position).toString();

        if(abc.equals("Select") && !selected.equals("Select"))
        {
            do something
        }

        else 
        {
            Do something
        }
        textQualification=selected;
        SearchUpdated("Qualification");
    }

    @Override
    public void onNothingSelected(AdapterView<?> parentView) {
        // your code here
    }
});
14
JNI_OnLoad

N'oubliez pas que vous ne pouvez pas resélectionner le même élément de spinner, il définit toujours le premier élément comme sélectionné si vous n'ajoutez pas de code personnalisé pour gérer la sélection de spinner.

Pour le Toast non affiché, je suggère de toujours utiliser le "MyActivity.this" comme contexte lors de la création d'un Toast dans une interface d'écoute comme celle-ci:

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)

Et le . Show () à la fin est facile à oublier parfois;)

6
TouchBoarder

En fait, si la visibilité de votre spinner est définie sur gone, cela déclenchera le clic lorsque vous appelez la méthode performclick () mais ne déclenchera pas sa setOnItemSelectedListener vous devez donc modifier la visibilité, cela fonctionnera

5
Mehroz Munir

Je sais que la question est un peu ancienne, mais dans le cas où vous attendez un rappel AsyncTask, assurez-vous d'informer votre adaptateur des modifications de données en appelant notifyDataSetChanged () sur le thread de rappel!

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