Android Spinner - onItemSelected / setOnItemSelectedListener未触发

19

这真的让我抓狂,因为这是我以前做过的事情,但现在却想不出为什么它不起作用了...

我有一个菜单按钮,以通常的方式通过一个menu.xml文件和onOptionsItemSelected方法实现,其中包含一个开关,创建并显示一个下拉列表。

我已经添加了setOnItemSelectedListener,但它似乎从来没有触发过。下拉列表出现了,我选了一个选项或退出了,但是onItemSelectedonNothingSelected都没有被调用。

以下是处理菜单按钮的switch语句中"case"和"return true"之间的所有代码。(topThis是指上下文活动的变量——对于应用程序中的所有其他toast工作正常)

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
谢谢你的建议 - 最终实现了类似的东西。在布局中添加了一个不可见的旋转器,将除performClick之外的所有内容从菜单方法中移动到onCreate中调用的方法中。这似乎确保监听器“附加”到当前充气的布局或类似的东西上。代码相对于setContentView(R.layout.main)的位置很重要... - Greg
1
我认为我的代码中涉及偶尔重新填充布局(使用setContentView(R.layout.main);)的事实也会导致问题......如果在重新填充布局后不再设置侦听器,则侦听器将不再附加。 - Greg
1
你应该尝试使用简单的Log语句 i("tag", "message"),而不是Toast来确认它是否是你的Context topThis引起的问题。 - TouchBoarder
performClick 可能会引起问题。它返回第一个项目,选择项目后返回 InputEventReceiver: Attempted to finish an input event but the input event receiver has already been disposed。目前还没有找到解决方法。 - LadyWoodi
解决方法:我不得不在xml中添加spinner(不要忘记android:spinnerMode="dialog",并且您可以设置0大小参数),并将= new Spinner(this);更改为= (Spinner) findViewById(R.id.dialog_spinner); - LadyWoodi
显示剩余5条评论
4个回答

14

当我在实现一个spinner时遇到了类似的问题,我通过获取父视图并设置适配器来解决它。

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

6

请记住,如果您没有添加一些自定义代码来处理微调器的选择,则无法重新选择相同的微调器项目,它始终将第一个项目设置为选定项。

对于Toast未显示的情况,我建议在此类侦听器接口中创建Toast时始终使用"MyActivity.this"作为您的上下文:

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()很容易被忘记。

5

实际上,如果您的旋转器可见性设置为gone,则在调用performclick()方法时会触发其点击,但不会触发其setOnItemSelectedListener,因此您需要更改可见性,然后它将起作用。


2

我知道这个问题有点老,但是如果你正在等待一个AsyncTask回调,请确保在回调线程上调用notifyDataSetChanged()来通知你的适配器数据已更改!

@Override
public void onPostExecute(String result) {
   ///do something with your data  
   spinnerArrayAdapter.notifyDataSetChanged();
}

谢谢。已经挖了两个小时了,终于找到了 :) - Jonas Liljestrand

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接