值改变时的Spinner

20

我系统中有两个下拉框。现在我需要根据第一个下拉框的值来更改第二个下拉框的选定值。当用户更改第一个下拉框的值时,第二个下拉框的值将自动设置为取决于第一个下拉框的选定值。如何实现这个功能?

3个回答

20

来自Hello Spinner教程:

现在创建一个实现AdapterView.OnItemSelectedListener接口的嵌套类。这将提供一个回调方法,通知您的应用程序当从Spinner中选择了一个项目时。以下是该类应该如何展示的内容:

public class MyOnItemSelectedListener implements OnItemSelectedListener {

    public void onItemSelected(AdapterView<?> parent,
        View view, int pos, long id) {
      Toast.makeText(parent.getContext(), "The planet is " +
          parent.getItemAtPosition(pos).toString(), Toast.LENGTH_LONG).show();
    }

    public void onNothingSelected(AdapterView parent) {
      // Do nothing.
    }
}

AdapterView.OnItemSelectedListener需要实现onItemSelected()和onNothingSelected()回调方法。前者在从AdapterView中选择一个项目时被调用,在这种情况下,会显示所选文本的短Toast消息;后者在从AdapterView中取消选择一个项目时被调用,在此情况下不会发生,因此它被忽略。 现在需要将MyOnItemSelectedListener应用于Spinner。返回到onCreate()方法并在末尾添加以下行: spinner.setOnItemSelectedListener(new MyOnItemSelectedListener());

换句话说,您需要创建一个OnItemSelectedListener来修改第二个Spinner的值,并将其附加到第一个Spinner上。


不使用 "implements" 实现它不可能吗? - dev_android
2
我不理解这个问题。你可以创建一个实现该接口的匿名类,但是你必须在某个时候创建一个实现该接口的对象,以便将其作为Spinner的监听器添加进去。 - I82Much

4

您需要在第一个下拉框的onItemSelected事件中设置条件。通过这个例子,您可以根据第一个下拉框的值获取第二个下拉框的值:

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

        if(arg0.equals(spin0)){
        spin1.setClickable(true);
                    if(spin0.getSelectedItem().equals("India"))
                    {
                        ArrayAdapter <String> s1 = new ArrayAdapter <String> (this,android.R.layout.simple_spinner_item,states_india);
                        s1.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
                        spin1.setAdapter(s1);
                    }
                    else  if(spin0.getSelectedItem().equals("Pakistan"))
                    {
                        ArrayAdapter <String> s2 = new ArrayAdapter <String> (this,android.R.layout.simple_spinner_item,states_pak);
                        s2.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
                        spin1.setAdapter(s2);
                    }
                    else  if(spin0.getSelectedItem().equals("China"))
                    {
                        ArrayAdapter <String> s3 = new ArrayAdapter <String> (this,android.R.layout.simple_spinner_item,states_china);
                        s3.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
                        spin1.setAdapter(s3);
                    }

        }

    }    

一个Spinner不支持项目点击事件。调用此方法将引发异常。相反,请使用AdapterView setOnItemSelectedListener。 - felansu

1
你应该为每个下拉框单独定义onItemSelected()。否则,如果从任何一个下拉框中选择了任何内容,代码都会被执行。
    newCategory.setOnItemSelectedListener(new OnItemSelectedListener() {

        @Override
        public void onItemSelected(AdapterView<?> arg0, View arg1,
                int arg2, long arg3) {
            // TODO Auto-generated method stub

            String selCat = newCategory.getItemAtPosition(arg2).toString();

            if (selCat != "New")
            {
                loadSpinnerData(topic);
            }
        }

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

        }
    });
    newTopic.setOnItemSelectedListener(new OnItemSelectedListener() {


        @Override
        public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2,
            long arg3) {
            // TODO Auto-generated method stub
            loadSpinnerData()
    }

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

2
setOnItemClickListener不能与Spinner一起使用。 - sandeep
如果当前活动中有多个微调控件,那么这将很好地运作 - 不知道为什么会被踩..... - CDVN

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