Search code examples
javaandroidif-statementnotifydatasetchanged

Using 1 spinner to dynamically change 2 spinners with if functions and notifyDataSetChanged?


Pretty new to Java in general. I have 3 Spinners in my code, and my 2 spinners would display lists depending on 1 main spinner ( which has 2 selections). After reading a few threads I read about refreshing the lists using notifySetDataChanged(); but the spinner lists never changed. Few questions :

  • Am I using the notifySetDataChanged correctly?
  • Is there another way to populate the lists?
  • Is the IF function the appropriate method?

Here's the code upto the onCreate method.

public class MainActivity extends Activity {

private Spinner spinner1, spinner2, spinner3, spinner4;
private Button convertButton;
private EditText from;
private List <String> list1 = new ArrayList<String>();
private List <String> list2 = new ArrayList<String>();


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

    from = (EditText) findViewById(R.id.amount);



  //spinners for units
    spinner1 = (Spinner) findViewById(R.id.spinner1);
    spinner2 = (Spinner) findViewById(R.id.spinner2);
    spinner4 = (Spinner) findViewById(R.id.spinner4_main);
    List<String>list4 = new ArrayList<String>();

    list4.add("Distance");
    list4.add("Weight");

    //adapter for main scale
   ArrayAdapter<String> dataAdapter4 = new ArrayAdapter <String> (this, 
                                        android.R.layout.simple_spinner_dropdown_item, list4);
            dataAdapter4.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
            spinner4.setAdapter(dataAdapter4);

    //adapter for "from" currency
    ArrayAdapter<String> dataAdapter1 = new ArrayAdapter<String>(this,
                                        android.R.layout.simple_spinner_item, list1);
            dataAdapter1.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
            spinner1.setAdapter(dataAdapter1); 

     //adapter for "to" currency       
            ArrayAdapter<String> dataAdapter2 = new ArrayAdapter<String>(this,
                                                android.R.layout.simple_spinner_item, list2);
            dataAdapter2.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
            spinner2.setAdapter(dataAdapter2);


    Object choice = spinner4.getSelectedItemPosition();
   if (choice.equals("Weight")) {
    //units to convert from
    dataAdapter1.clear();
    dataAdapter1.add("Milligrams");
    dataAdapter1.add("Grams");
    dataAdapter1.add("Kilograms");
    dataAdapter1.add("Metric Ton");




    //units to convert to
    dataAdapter2.clear();
    dataAdapter2.add("Milligrams");
    dataAdapter2.add("Grams");
    dataAdapter2.add("Kilograms");
    dataAdapter2.add("Metric Ton");


   }


   else //(spinner4.getSelectedItem().toString().equals("Distance"))
       {

       //spinner1 = (Spinner) findViewById(R.id.spinner1);
       dataAdapter1.clear();
       dataAdapter1.add("Millimeter");
       dataAdapter1.add("Centimeter");
       dataAdapter1.add("Meter");
       dataAdapter1.add("Kilometer");





       dataAdapter2.clear();
       dataAdapter2.add("Millimeter");
       dataAdapter2.add("Centimeter");
       dataAdapter2.add("Meter");
       dataAdapter2.add("Kilometer");



   }

   dataAdapter1.notifyDataSetChanged();
    dataAdapter2.notifyDataSetChanged();

}`

If anyone could explain what's wrong please enlighten this newbie. =)


Solution

  • U are approaching this wrong. Here is what you should do..

    1. Define Spinner 1, 2 and 3.
    2. Define arrayAdapters for spinner 1,2,3.
    3. Populate ArrayAdapter and define this as the adapter for Spinner 1 (spinner1.setadapter(arrayadapter1)
    4. Then call the spinner1.setOnItemSelectedListener. In the method onItemSelected, populate the logic to populate the array for spinner 2 and spinner 3 as per your requirement. Then call spinner2.setadapter(arrayadapter2) and spinner3.setadapter(arrayadapter3).
    5. This should work.

    So initially, spinner2 and spinner3 will not have any content. even if user clicks, there will be nothing in the dropdown. But once Spinner1 is selected by user, spinner2 and spinner3 will have dropdown values.

    Please read up on setOnItemSelectedListener. Lots of tutorials are available. You can refer here to get a start.

    If this works for you, please accept my answer.