2013-04-16 2 views
1

У меня есть этот код. Модель Spinner автоматически заполняется в соответствии с тем, что пользователь выбирает для производства. (Для приведенного ниже кода я только установил его для BMW). Есть ли способ для заполнения третьего счетчика (Цвет) на основе производства и модели.Автоматическое заполнение Spinner на основе предыдущего Spinner - android

Итак, если вы выбрали BMW на первом счетчике, а затем вы выбрали купе M3 для второго счетчика, третий счетчик отобразит всю опцию в M3_Color Array.

import android.app.Activity; 
    import android.os.Bundle; 
    import android.view.View; 
    import android.widget.AdapterView; 
    import android.widget.AdapterView.OnItemSelectedListener; 
    import android.widget.ArrayAdapter; 
    import android.widget.Spinner; 

    public class MainActivity extends Activity implements OnItemSelectedListener { 

    private String[] Manufacture { "Ford", 
            "BMW", 
            "Nissan", 
            "Toyota", 
            "Chevy", 
           }; 

    private String[] BMW_Model = { "128i Coupe", 
          "M3 Coupe", 
          "M5 Sedan", 
          "640i Gran Coupe", 
          "335i Coupe", 
           }; 


    private String[] M3_Color = { "Jerez Black Metallic", 
          "Melbourne Red Metallic", 
          "Mineral White Metallic", 
          "Le Mans Blue Metallic", 
          }; 


     Spinner spinnerManufacture, spinnerModel, spinnerColor; 


     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 


    spinnerManufacture = (Spinner) findViewById(R.id.manufacture_spinner); 


    ArrayAdapter<String> MaufactureAdapter = new ArrayAdapter<String> (this, android.R.layout.simple_spinner_item,Manufacture); 


     MaufactureAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
    spinnerManufacture.setAdapter(MaufactureAdapter); 


    spinnerManufacture.setOnItemSelectedListener(this); 


    } 
    @Override 
    public void onItemSelected(AdapterView<?> parent, View view, int position,long id) { 
     // TODO Auto-generated method stub 
     { 
      if(parent.getId() == R.id.maufacture_spinner && position == 1) 
      { 
       spinnerModel = (Spinner) findViewById(R.id.model_spinner); 
       ArrayAdapter<String> ModelAdapter = new ArrayAdapter<String> (this, android.R.layout.simple_spinner_item, BMW_Model); 
       ModelAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
       spinnerModel.setAdapter(ModelAdapter); 


       if(parent.getId() == R.id.model_spinner) 
       { 
       String[] Color; 
       if(spinnerMaufacture.getSelectedItem().toString.equals("BMW")) 
       { 
         if(spinnerModel.getSelectedItem().toString.equals("M3 Coupe)) 
        { 
        Color = M3_Color 
        } 
       } 

        spinnerColor = (Spinner) findViewById(R.id.color_spinner); 
        ArrayAdapter<String> ColorAdapter = new ArrayAdapter<String> (this, android.R.layout.simple_spinner_item, M3_Color); 
        ColorAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
        spinnerColor.setAdapter(ColorAdapter); 
       } 
      } 




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

    } 
    } 

ответ

2

вам нужно переместить if(parent.getId() == R.id.model_spinner) вне if(parent.getId() == R.id.maufacture_spinner затем Makesure и вызвать spinnerModel.setOnItemSelectedListener(this) OnCreate, чтобы сделать это, Вы должны переместить spinnerModel = (Spinner) findViewById(R.id.model_spinner) в свой при создании, я рекомендовал бы делать то же самое для всех ваших взглядов, таким образом вы не 't звоните findViewById каждый раз, когда вы выбираете элемент счетчика.

EDIT:

Spinner spinnerManufacture, spinnerModel, spinnerColor; 
private ArrayAdapter<String> modelAdapter; 
private ArrayAdapter<String> maufactureAdapter; 
private ArrayAdapter<String> colorAdapter; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    spinnerManufacture = (Spinner) findViewById(R.id.manufacture_spinner); 
    spinnerModel = (Spinner) findViewById(R.id.model_spinner); 
    spinnerColor = (Spinner) findViewById(R.id.color_spinner); 

    maufactureAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, Manufacture); 
    modelAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item); 
    colorAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item); 

    maufactureAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
    modelAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
    colorAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 

    spinnerColor.setAdapter(colorAdapter); 
    spinnerManufacture.setAdapter(maufactureAdapter); 
    spinnerModel.setAdapter(modelAdapter); 

    spinnerManufacture.setOnItemSelectedListener(this); 
    spinnerModel.setOnItemSelectedListener(this); 
    spinnerColor.setOnItemSelectedListener(this); 

} 

@Override 
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 
    if (parent.getId() == R.id.maufacture_spinner) { 
     String[] model; 
     if (spinnerManufacture.getSelectedItem().toString().equals("BMW")){ 
      model = BMW_Model; 
     } else { 
      model = new String[] {"not sure what model list to use"}; 
     } 
     modelAdapter.clear(); 
     modelAdapter.addAll(model); 
    } 
    if (parent.getId() == R.id.model_spinner) { 
     String[] Color; 
     if (spinnerModel.getSelectedItem().toString().equals("M3 Coupe")) { 
      Color = M3_Color; 
     } else if (spinnerModel.getSelectedItem().toString().equals("M5 Sedan")) { 
      Color = M5_Color; 
     } else { 
      Color = new String[] { "not sure what color list to use" }; 
     } 
     colorAdapter.clear(); 
     colorAdapter.addAll(Color); 
    } 
} 

это то, что я рекомендую вам попробовать.

+0

По какой-то причине второй spinner не заполняется, делая это таким образом – user31610

+0

обновлен с примером @ user31610 – Eluvatar

+0

Спасибо вам большое – user31610

0

Просто постройте строку на основе того, что выбрано, как показано ниже. Это задает список цветов как M3_Color для BMW и M3 Coupe, и M5_Color, когда выбраны BMW и M5 Sedan. Это необходимо сделать для всех возможных комбинаций.

 if(parent.getId() == R.id.model_spinner) 
     { 
       String[] Color = new String[]; 
       if(spinnerManufacture.getSelectedItem().toString().equals("BMW")) 
       { 

        if(spinnerModel.getSelectedItem().toString().equals("M3 Coupe")) 
        { 
         Color = M3_Color; 
        } 
        else if(spinnerModel.getSelectedItem().toString().equals("M5 Sedan")) 
        { 
         Color = M5_Color; 
        } 
       } 
       spinnerColor = (Spinner) findViewById(R.id.color_spinner); 
       ArrayAdapter<String> ColorAdapter = new ArrayAdapter<String> (this, android.R.layout.simple_spinner_item, Color); 
       ColorAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
       spinnerColor.setAdapter(ColorAdapter); 
     } 
+0

Когда я пытаюсь объявить массив цветов, я получаю эту ошибку: переменная должна содержать либо выражения измерения, либо инициализатор массива – user31610

+2

попробуйте использовать 'String [] Color;' вам не нужно создавать массив там, просто объявите переменную. – Eluvatar

+0

спасибо, второй spinner заселен, как и должен, но третий счетчик не показывает никаких значений, когда вы используете второй счетчик на купе M3. – user31610