Android下拉菜单:获取所选项目更改事件

454

当Spinner选择的项目发生变化时,如何设置事件监听器?

基本上我想做的是类似于这样的事情:

spinner1.onSelectionChange = handleSelectionChange;

void handleSelectionChange(Object sender){
    //handle event
}

我尝试过这些答案,但没有一个有用。Spinner组件不支持项目点击事件。 Spinner文档 - user1470285
17个回答

4

如果你想要一个真正的onChangedListener()。在处理程序中存储初始值并检查其是否已更改。这很简单,不需要全局变量。如果页面上有多个下拉框,则可以使用此方法。

String initialValue = // get from Database or your object
mySpinner.setOnItemSelectedListener(new SpinnerSelectedListener(initialValue));

...

protected class SpinnerSelectedListener implements AdapterView.OnItemSelectedListener {

        private SpinnerSelectedListener() {
            super();
        }

        public SpinnerSelectedListener(String initialValue) {
            this();
            this.initialValue = initialValue;
        }

        private String initialValue;

        // getter and setter removed.  

        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            final String newValue = (String) spinHeight.getItemAtPosition(position);
            if (newValue.equals(initialValue) == false) {
               // Add your code here.  The spinner has changed value. 

               // Maybe useful.   
               // initialValue = newValue;
            }

        }

        @Override
        public void onNothingSelected(AdapterView<?> parent) {
               // Maybe useful.   
               // initialValue = null; 
        }
    }

对象是你的朋友,要善于使用它们。


3
spinner.setOnItemSelectedListener(
            new AdapterView.OnItemSelectedListener() {

                @Override
                public void onItemSelected(AdapterView<?> arg0, View arg1,
                        int arg2, long arg3) {

                    // TODO Auto-generated method stub
                }

                @Override
                public void onNothingSelected(AdapterView<?> arg0) {
                    // TODO Auto-generated method stub

                }
                //add some code here
            }
        );

2

这将有效 初始化下拉列表并通过findviewbyid查找控件,然后使用它即可

    Spinner schemeStatusSpinner;

  schemeStatusSpinner = (Spinner) dialog.findViewById(R.id.spinner);

schemeStatusSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {
            // your code here
            if(schemeStatusSpinner.getSelectedItemId()==4){
                reasonll.setVisibility(View.VISIBLE);
            }
            else {
                reasonll.setVisibility(View.GONE);
            }
        }

        @Override
        public void onNothingSelected(AdapterView<?> parentView) {
            // your code here
        }

    });

我们如何使用lambda编写它? - The MJ

2
默认情况下,您将通过以下方式获取旋转器数组的第一项
value = spinner.getSelectedItem().toString();

无论何时您在下拉列表中选择了一个值,它都会为您提供所选的值。
如果您想要所选项目的位置,则可以这样做。
pos = spinner.getSelectedItemPosition();

上述两个答案是针对不使用监听器的情况。

1
我认为最好的方法是在 onCreate() 中设置一个 flagitemselected = 0;。然后在项目选中事件中递增该标志,即flagitemselected++;然后检查。
if(flagitemselected!=1)
{
// do your work here
}

这个应该会有帮助。


1
我知道这个问题早已解决,但是我的字符串数组顶部有一个“请选择”字符串。然后当你编写监听器时,
yourspinner.onItemSelectedListener = object : OnItemSelectedListener {
            override fun onItemSelected(adapterView: AdapterView<*>?, view: View, i: Int, l: Long) {
                yourvalue = yourspinner.getSelectedItem().toString()

                when(yourvalue){
                    "Please Select" -> // DO nothing
                    else -> // Do something
                }
            }

            override fun onNothingSelected(adapterView: AdapterView<*>?) {
                return
            }
        }

当然,您可以扩展when语句以具有不同的响应或操作。


0
一个我发现的技巧是将setOnItemSelectedListeners放在onWindowFocusChanged而不是onCreate中。到目前为止,我没有发现任何不良副作用。基本上,在窗口被绘制后设置监听器。我不确定onWindowFocusChanged运行的频率有多高,但如果您发现它运行太频繁,可以轻松地创建一个锁变量。
我认为Android可能正在使用基于消息的处理系统,如果您将所有代码都放在onCreate中,可能会遇到下拉菜单在绘制之后才被填充的情况。因此,在设置项目位置之后,您的监听器将触发。当然,这只是我的猜测,请随时纠正我。

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