Search code examples
androidandroid-spinner

Android Multi Spinner


I would like to develop an android app with three spinners. These three spinners will contain the information about the cars, which are brands, models, and engines.

  1. So, after the first spinner(brand) is chosen, the contents of the second spinner(model) should be added depend on the selected brand.
  2. Next, the second spinner will be selected and then the third spinner(engine) will be added.

I have searched with keyword "Android Multi Spinners" and "Android listener for spinners" on google and stackoverflow for almost a week, but I still didn't find the solution.

Here are the links that I got the idea for my code

So, I have two versions of my source code, but both of them didn't work. (Edited: Working now)

For the first version

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.Button;
import android.widget.Spinner;

public class AddCarActivity extends Activity {

    private Spinner spnBrand, spnModel, spnEngine;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.add_car);

        addItemsOnSpnBrand();   
    }

    public void addItemsOnSpnBrand() {
        spnBrand = (Spinner) findViewById(R.id.spnBrand);
        List<String> list = new ArrayList<String>();

        //Get Brand Database and Add to List

        ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, list);
        dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spnBrand.setAdapter(dataAdapter);       

        addListenerOnSpnBrandItemSelection();
    }

    public void addListenerOnSpnBrandItemSelection() {
        spnBrand = (Spinner) findViewById(R.id.spnBrand);       
        spnBrand.setOnItemSelectedListener(new OnItemSelectedListener() {
            public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
                addItemOnSpnModel(parent.getItemAtPosition(pos).toString());
            }

            public void onNothingSelected(AdapterView<?> parent) {
                return;
            }
        });
    }

    public void addItemOnSpnModel(String inBrand) {
        spnModel = (Spinner) findViewById(R.id.spnModel);
        List<String> list = new ArrayList<String>();

        //Get Model Database and Add to List

        ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, list);
        dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spnSeries.setAdapter(dataAdapter);      

        addListenerOnSpnModelItemSelection();
    }

    public void addListenerOnSpnModelItemSelection() {
        spnModel = (Spinner) findViewById(R.id.spnModel);
        spnModel.setOnItemSelectedListener(new OnItemSelectedListener() {
            public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
                addItemOnSpnEngine(parent.getItemAtPosition(pos).toString());               
            }

            public void onNothingSelected(AdapterView<?> parent) {
                return;
            }
        });
    }

    public void addItemOnSpnEngine(String inModel) {
        spnEngine = (Spinner) findViewById(R.id.spnEngine);
        List<String> list = new ArrayList<String>();
    
        //Get Engine Database and Add to List

        ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, list);
        dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spnEngine.setAdapter(dataAdapter);
    }
}

Here is my Second version

public class AddCarActivity extends Activity implements OnItemSelectedListener {

    private Spinner spnBrand, spnModel, spnEngine;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.add_car);

        addItemsOnSpnBrand();
    }

    public void onItemSelected(AdapterView<?> parent, View view, int position,long arg3) {
        int id = parent.getId();
        switch (id) 
        {
            case R.id.spnBrand:
                addItemOnSpnModel(parent.getItemAtPosition(position).toString()); break;
            case R.id.spnModel:
                addItemOnSpnEngine(parent.getItemAtPosition(position).toString()); break;
        }
    }

    public void onNothingSelected(AdapterView<?> arg0) {
        return;
    }

    public void addItemsOnSpnBrand() {
        spnBrand = (Spinner) findViewById(R.id.spnBrand);
        List<String> list = new ArrayList<String>();

        //Get Brand Database and Add to List
    
        ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, list);
        dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spnBrand.setAdapter(dataAdapter);

        spnBrand.setOnItemSelectedListener(this);
    }

    public void addItemOnSpnModel(String inBrand) {
        spnModel = (Spinner) findViewById(R.id.spnModel);
        List<String> list = new ArrayList<String>();

        //Get Model Database and Add to List

        ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, list);
        dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spnModel.setAdapter(dataAdapter);

        spnModel.setOnItemSelectedListener(this);
    }

    public void addItemOnSpnEngine(String inModel) {
        spnEngine = (Spinner) findViewById(R.id.spnEngine);
        List<String> list = new ArrayList<String>();
    
        //Get Engine Database and Add to List

        ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, list);
        dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spnEngine.setAdapter(dataAdapter);
    }
}

Thank you everyone that have tried to help me. I just found the problem when retest the codes for answering Hip Hip Array. I use the wrong variable in addListenerOnSpnModelItemSelection(). I mistaken to use spnBrand instead of spnModel. Now, these two versions are worked, so I corrected them and hope that they will help the others that try to use the multi-spinners in android.


Solution

  • Lets say,you have 3 spinners spinner_1,spinner_2 and spinner_3 then:

    spinner_1.setOnItemSelectedListener(new OnItemSelectedListener() {
    
                @Override
                public void onItemSelected(AdapterView<?> arg0, View arg1,
                        int position, long arg3) {
    
                                if(spinner_1.getSelectedItem().equals("Spin1-Item-1")){
                                {
                                      // set adapter to spinner_2 here for "Spin1-Item-1" selected
                                }
                                else if(spinner_1.getSelectedItem().equals("Spin1-Item-2"))
                                {
                                     // set adapter to spinner_2 for "Spin1-Item-2" not selected
                                }
                                else 
                                {
                                     // set adapter to spinner_2 for "Spin1-Item-3" not selected
                                }
                }    
                @Override
                public void onNothingSelected(AdapterView<?> arg0) {                
                }
    });
    spinner_2.setOnItemSelectedListener(new OnItemSelectedListener() {
    
                @Override
                public void onItemSelected(AdapterView<?> arg0, View arg1,
                        int position, long arg3) {
    
                                if(spinner_2.getSelectedItem().equals("Spin2-Item-1")){
                                {
                                      // set adapter to spinner_3 here for "Spin2-Item-1" selected
                                }
                                else if(spinner_2.getSelectedItem().equals("Spin2-Item-2"))
                                {
                                     // set adapter to spinner_3 for "Spin2-Item-2" not selected
                                }
                                else 
                                {
                                     // set adapter to spinner_3 for "Spin2-Item-3" not selected
                                }
                }    
                @Override
                public void onNothingSelected(AdapterView<?> arg0) {                
                }
    });