这让我感到疯狂,因为这是我以前做过的事,但无法弄清楚为什么它现在不起作用......
我有一个菜单按钮,通过menu.xml
文件以及带有开关的onOptionsItemSelected
方法以常规方式实现,创建并显示一个微调器。
我添加了setOnItemSelectedListener
,但它似乎永远不会触发。微调器出现,我选择一个选项或退出,onItemSelected
或onNothingSelected
都被调用。
这是菜单按钮处理开关语句的“case”和“return true”之间的所有代码。 (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
的事实是问题...
答案 0 :(得分:14)
当我实现一个微调器时,我遇到了类似的问题,我通过获取父视图并设置适配器来解决它 -
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
}
});
答案 1 :(得分:6)
请记住,如果您没有添加一些自定义代码来处理微调器选择,则无法重新选择相同的微调器项,它始终将第一个项设置为选中。
对于Toast没有显示,我建议总是使用&#34; MyActivity.this&#34;作为在侦听器界面中创建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();)
答案 2 :(得分:5)
实际上,如果您的微调器可见性设置为消失,那么当您调用 performclick()方法时它会触发点击它,但它不会触发 setOnItemSelectedListener 强> 所以你需要改变可见性然后才能工作
答案 3 :(得分:2)
我知道这个问题有点旧,但是如果您正在等待AsyncTask回调,请确保通过在回调线程上调用notifyDataSetChanged()让您的适配器知道数据更改!
@Override
public void onPostExecute(String result) {
///do something with your data
spinnerArrayAdapter.notifyDataSetChanged();
}