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