Android Spinner - onItemSelected / setOnItemSelectedListener ne déclenche pas

cela me rend fou puisque c'est quelque chose que j'ai fait avant mais ne peut pas comprendre pourquoi ça ne fonctionne pas maintenant...

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

j'ai ajouté setOnItemSelectedListener, mais il ne semble jamais à déclencher. Le compteur s'affiche, je choisis une option ou à l'arrière, ni onItemSelected ou onNothingSelected sont appelés.

voici tout le code entre "case" et "return true" de l'instruction menu-button-handling switch. (topThis est une variable faisant référence au contexte de l'activité fonctionne très bien pour tous les autres toasts dans 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
demandé sur HitOdessit 2011-02-07 18:51:11

4 réponses

j'ai eu le même problème quand j'ai implémenté un spinner, Je l'ai résolu en obtenant la vue parent et en réglant 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
répondu JNI_OnLoad 2013-03-02 22:36:46

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

pour que le Toast ne se montre pas, je suggère d'utiliser toujours le "MyActivity.ceci" comme votre contexte lors de la création D'un Toast à l'intérieur d'une interface d'écoute comme ceci:

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 .show () à la fin est facile d'oublier parfois;)

6
répondu TouchBoarder 2016-11-23 15:56:44

en fait, si votre visibilité de spinner est définie à passé ensuite, il va déclencher le clic lorsque vous appelez performclick () méthode, mais elle ne déclenche pas les setOnItemSelectedListener vous devez donc changer la visibilité puis cela fonctionnera

4
répondu Mehroz Munir 2016-03-08 07:17:52

je sais que la question est un peu vieille, mais dans le cas où vous attendez un rappel AsyncTask, assurez-vous que vous informez votre adaptateur des changements 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
répondu Nostradamus 2013-09-15 19:50:31