【问题标题】:Spinner on value Change价值变化的微调
【发布时间】:2011-07-10 08:22:07
【问题描述】:

我的系统中有两个微调器。现在我必须根据第一个微调器值更改第二个微调器的选定值。一旦用户更改第一个微调器值,第二个微调器值将根据第一个微调器的选定值自动设置。如何实现?

【问题讨论】:

    标签: android spinner onchange


    【解决方案1】:

    来自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 消息显示所选文本; and the latter is called when a selection disappears from the AdapterView, which doesn't happen in this case, so it's ignored. 现在需要将 MyOnItemSelectedListener 应用到 Spinner。回到 onCreate() 方法,在末尾添加以下行: spinner.setOnItemSelectedListener(new MyOnItemSelectedListener());

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

    【讨论】:

    • 不使用“implements”就不能实现吗?
    • 我不明白这个问题。您可以创建一个实现该接口的匿名类,但是是的,您必须在某些时候创建一个实现该接口的对象,以便将其添加为微调器的侦听器。
    【解决方案2】:

    您必须将条件放在第一个微调器的 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);
                        }
    
            }
    
        }    
    

    【讨论】:

    • 微调器不支持项目点击事件。调用此方法将引发异常。而是使用 AdapterView setOnItemSelectedListener。
    【解决方案3】:

    您应该为每个微调器分别定义 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
            }
        });
    

    【讨论】:

    • setOnItemClickListener 不能与微调器一起使用
    • 如果您在当前活动中不只是旋转器,那么这很有效 - 不知道为什么投反对票.....
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-12
    • 1970-01-01
    • 2011-09-05
    • 1970-01-01
    • 1970-01-01
    • 2021-02-26
    • 1970-01-01
    相关资源
    最近更新 更多