【问题标题】:Dynamic update of Spinner2 based on choice in Spinner 1Spinner2 基于 Spinner 1 中的选择动态更新
【发布时间】:2011-05-28 09:07:03
【问题描述】:

在使用此代码(改编自 here)时,我收到以下错误:

构造函数 ArrayAdapter(new AdapterView.OnItemSelectedListener(){}, int, String[]) 未定义

谁能帮助纠正这个问题?谢谢

private void setDynamicSpinnerBE() {
    beSpinner = (Spinner) findViewById(R.id.spBE);
    final String[] itemsSpinner2;
    lensSpinner.setOnItemSelectedListener(new OnItemSelectedListener() {

        public void onItemSelected(AdapterView<?> parent, View view,
                int position, long id) {
            Integer focalLength = (Integer) parent.getAdapter().getItem(
                    position);
            itemsSpinner2 = getBellowsExtension(focalLength, maxBellows,
                    precision);

            ArrayAdapter<CharSequence> beAdapter = new ArrayAdapter<CharSequence>(
                    this, android.R.layout.simple_spinner_item,
                    itemsSpinner2);
            beAdapter
                    .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
            beSpinner.setAdapter(beAdapter);

        }

        public void onNothingSelected(AdapterView<?> parent) {
            beSpinner.setAdapter(null);
        }
    }

    );
    ...
}

【问题讨论】:

    标签: java android spinner dynamic


    【解决方案1】:

    在您的新ArrayAdapter 的构造函数中的以下行:

    ArrayAdapter<CharSequence> beAdapter = new ArrayAdapter<CharSequence>(this,
    

    this 指向你所在的OnItemSelectedListener 类的当前实例,而不是父视图,这是问题发生的地方,因为ArrayAdapter 没有匹配的构造函数。您应该尝试使用MyParentView.this(其中MyParentView 是您所在视图的名称)来传递适当的实例。

    【讨论】:

    • 太好了,谢谢。我认为这对很多初学者会很有帮助。
    • @keonbro 很高兴听到这个消息!
    • 谢谢,这很有帮助。
    • 非常感谢非常有帮助
    【解决方案2】:

    是的,就是这样:

    import android.app.Activity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.AdapterView;
    import android.widget.ArrayAdapter;
    import android.widget.Spinner;
    import android.widget.AdapterView.OnItemSelectedListener;
    
    public class DynamicSpinner extends Activity {
        private Spinner firstSpinner, secondSpinner;
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            findViews();
            setAdapters();
            setListeners();
        }
    
    private void findViews() {
        firstSpinner = (Spinner) findViewById(R.id.spLenses);
        secondSpinner = (Spinner) findViewById(R.id.spBE);
    }
    
    private void setAdapters() {
        ArrayAdapter<CharSequence> firstAdapter = ArrayAdapter.createFromResource(this, 
                R.array.lens_array, android.R.layout.simple_spinner_item);
        firstAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        firstSpinner.setAdapter(firstAdapter);
    }
    
    /* 
     * This is the important part. The user's choice in Spinner1 is passed to 
     * the procedure getDataForSecondSpinner () which creates an array shown in Spinner2  
     */
    private void setListeners() {
        firstSpinner.setOnItemSelectedListener( new OnItemSelectedListener() {
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                String userChoiceSpinner1 =  (String) parent.getSelectedItem(); 
                String[] itemsSpinner2 = getDataForSecondSpinner (Integer.parseInt(userChoiceSpinner1)); 
    
                ArrayAdapter<CharSequence> secondAdapter = new ArrayAdapter<CharSequence>(DynamicSpinner.this, 
                        android.R.layout.simple_spinner_item, itemsSpinner2);
                secondAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);       
                secondSpinner.setAdapter(secondAdapter);                
            }
            public void onNothingSelected(AdapterView<?> parent) {
                secondSpinner.setAdapter(null);
            }
          }
        );
    
        secondSpinner.setOnItemSelectedListener(new OnItemSelectedListener() {
            public void onItemSelected(AdapterView<?> parent, View v, int position, long id) {
            }
            public void onNothingSelected (AdapterView<?> parent) {
            }
          }
        );
    }
    
    /*
     * Returns an array based on user choice in Spinner 1 
     */
    private String[] getDataForSecondSpinner (int userChoiceSpinnerOne) { 
        //some arbitrary parameters needed for my example, ignore...
        int param2 = 330;
        double param3 = 0.17;
        int array_index = 0;
    
        int inputUserChoice = userChoiceSpinnerOne;
    
        float param5 =  (float) ( (float) param2 / (float)userChoiceSpinnerOne  - 1); 
        int array_size = (int) (Math.round(param5  / param3) + 2);
        String[] arrayBE= new String[array_size];
    
        while (inputUserChoice <= param2) {
            inputUserChoice = (int) (userChoiceSpinnerOne * (param3 * array_index + 1));
            if (inputUserChoice <= param2) { 
                arrayBE[array_index] = String.valueOf(inputUserChoice);
            }
            else {
                arrayBE[array_index] = String.valueOf(param2);
            }
            array_index = array_index + 1;
            }
    
        return arrayBE;
    }
    
    
    }
    

    【讨论】:

      猜你喜欢
      • 2016-07-20
      • 1970-01-01
      • 1970-01-01
      • 2011-11-14
      • 1970-01-01
      • 1970-01-01
      • 2022-01-15
      • 2021-12-08
      • 2017-01-26
      相关资源
      最近更新 更多