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