How to get selected item position from Spinner using SimpleAdapter

Mark Dev picture Mark Dev · Jun 30, 2016 · Viewed 8.9k times · Source

I have a spinner, which is populated using below code, I want to get the item selected by user from spinner. What is the best way for this ?

    List<Map<String, String>> tablelist  = new ArrayList<>();
    SQLiteDatabase db = openOrCreateDatabase("database", MODE_PRIVATE, null);
    String query = "select * from table";
    Cursor ps = db.rawQuery(query, null);
    while (ps.moveToNext()){
        Map<String, String> datanum = new HashMap<>();
        datanum.put("Id", ps.getString(ps.getColumnIndex("Id")));
        datanum.put("Some", ps.getString(ps.getColumnIndex("Some")));
        tablelist.add(datanum);
    }
    db.close();
    ps.close();
    SimpleAdapter spinnerAdapter = new SimpleAdapter(this, tablelist,  R.layout.row_spinner, new String[] {"Id", "Some"},  new int[] {android.R.id.text1, android.R.id.text1});
    spinnerAdapter.notifyDataSetChanged();
    spinnerAdapter.setDropDownViewResource(R.layout.row_spinner_list);
    spinner.setAdapter(spinnerAdapter);

Answer

Lucsartes picture Lucsartes · Jun 30, 2016

I will answer to the question : "best way to get the position of the item I require for setSelection() method" I hope it is what you're asking for.

I change SimpleAdapter with ArrayAdapter.

I prefere create an object for each result for you're DTB request, and map the object into the spinner. So you can access each result easily.

like this :

public class test {
    private String TAG = "test";

    private Activity curAct;
    private Spinner spinner;
    private SpnObj[] spinnerOptions;

    public test(Activity curAct) {
        this.curAct = curAct;
    }

    public void test() {
        this.spinner = new Spinner(this.curAct);
        this.spinnerOptions = this.getSpnContent();

        final ArrayAdapter spinnerAdapter = new ArrayAdapter<>(this.curAct, android.R.layout.simple_spinner_item, spinnerOptions);
        spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        this.spinner.setAdapter(spinnerAdapter);

        // setSelection with item id = 1
        this.preSelectItem(1);

        // setSelection with item some = 'some'
        this.preSelectItem("some");

        // get selectedItem
        SpnObj selectedItem = this.getSelectedItem();

        Log.d(TAG, "the current selected item id is : " + selectedItem.id);
        Log.d(TAG, "the current selected item some is : " + selectedItem.some);
    }

    // this method should be used when you need to access on you're selectedItem
    public SpnObj getSelectedItem() {
        return (SpnObj) this.spinner.getSelectedItem();
    }

    // this method should be used for set the selection on a item with the id => maybe that was what you're asking for
    public void preSelectItem(int id) {
        boolean doWeStopTheLoop = false;

        for (int i = 0; i < this.spinnerOptions.length && !doWeStopTheLoop; i++) {
            if (((SpnObj) this.spinner.getItemAtPosition(i)).id == id) {
                this.spinner.setSelection(i);
                doWeStopTheLoop = true; //you can use break; too
            }
        }
    }

    // this method should be used for set the selection on a item with the id => maybe that was what you're asking for
    // surcharge for 'some' column
    public void preSelectItem(String some) {
        boolean doWeStopTheLoop = false;

        for (int i = 0; i < this.spinnerOptions.length && !doWeStopTheLoop; i++) {
            if (((SpnObj) this.spinner.getItemAtPosition(i)).some.equals(some)) {
                this.spinner.setSelection(i);
                doWeStopTheLoop = true; //you can use break; too
            }
        }
    }

    private SpnObj[] getSpnContent() {      // this method must be call in a thread
        SQLiteDatabase db = this.curAct.openOrCreateDatabase("database", 0, null);
        String query = "select * from table";
        Cursor ps = db.rawQuery(query, null);

        SpnObj[] spnContent = new SpnObj[ps.getColumnCount()];

        if (ps.getColumnCount() > 0) {
            int iterator = 0;
            while (ps.moveToNext()) {
                spnContent[iterator] = new SpnObj(
                        ps.getInt(ps.getColumnIndex("Id")),
                        ps.getString(ps.getColumnIndex("Some"))
                );

                iterator++;
            }
        } else {
            // no rows : insert code here if you want manage this
        }

        db.close();
        ps.close();

        return spnContent;
    }
}

// this object is only encapsulate the DTB result in a java class, so we can work easily with
class SpnObj {
    public int id;
    public String some;

    public SpnObj(int id, String some) {
        this.id = id;
        this.some = some;
    }

    @Override
    public String toString() {          // important ! this method will be used for display the value in the dropdown list from the spinner
        return this.some;
    }
}