Android Spinner - onItemSelected/setOnItemSelectedListener не запускает
Это сводит меня с ума, так как я уже делал это раньше, но не могу понять, почему он сейчас не работает...
У меня есть кнопка меню, реализованная обычным способом с помощью файла menu.xml
и метода onOptionsItemSelected
с помощью переключателя в нем, который создает и отображает счетчик.
Я добавил setOnItemSelectedListener
, но он никогда не срабатывает. Появится spinner, я выбираю опцию или отступаю, не вызываются onItemSelected
или onNothingSelected
.
Вот весь код между "case" и "return true" оператора switch-button-handling. (topThis
- это переменная, относящаяся к контексту активности - отлично работает для всех других тостов в приложении)
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();
Любые идеи? Я смутно подозреваю, что тот факт, что я создаю Spinner
программно, является проблемой...
Ответы
Ответ 1
У меня была аналогичная проблема, когда я выполнял spinner, я разрешил ее, получив родительский вид и установив Adapter -
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
}
});
Ответ 2
Помните, что вы не можете повторно выбрать один и тот же элемент spinner, он всегда устанавливает первый элемент как выбранный, если вы не добавляете какой-либо пользовательский код для обработки выбора счетчика.
Чтобы не показывать Toast, я бы предложил всегда использовать "MyActivity.this" в качестве вашего контекста при создании Toast внутри интерфейса прослушивателя, например:
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)
И .show() в конце легко забыть иногда;)
Ответ 3
На самом деле, если ваша видимость спиннера установлена на ушла, тогда она вызывает щелчок, когда вы вызываете метод выполнитьclick(), но он не будет запускать его setOnItemSelectedListener
поэтому вам нужно изменить видимость, тогда он будет работать.
Ответ 4
Я знаю, что вопрос немного устарел, но если вы ожидаете обратного вызова AsyncTask, убедитесь, что ваш адаптер узнал об изменениях данных, вызвав notifyDataSetChanged() в потоке обратного вызова!
@Override
public void onPostExecute(String result) {
///do something with your data
spinnerArrayAdapter.notifyDataSetChanged();
}