Search code examples
androidandroid-spinnersettextonitemselectedlistener

Set spinner selected item text


I have a spinner (only relevant parts of code)...

protected void onCreate(Bundle savedInstanceState) {

   Spinner to_spinner = (Spinner) findViewById(R.id.to_spinner);
   List<Unit> list = myDbHelper.getAllUnits();
   SpinnerUnitAdapter tUnitAdapter tUnitAdapter = new SpinnerUnitAdapter(this, android.R.layout.simple_spinner_item, list);

   to_spinner.setAdapter(tUnitAdapter);
   to_spinner.setOnItemSelectedListener(onItemSelectedListenerTo);
}

with an onItemSelectedListener

AdapterView.OnItemSelectedListener onItemSelectedListenerTo = new     AdapterView.OnItemSelectedListener() {

    @Override
    public void onItemSelected(AdapterView<?> adapterView, View view,
                               int position, long id) {

        // do stuff
    }

    @Override
    public void onNothingSelected(AdapterView<?> adapter) {
    }
};

When an item is selected (i.e. where it says: "do stuff"), I would like to set/change the text of the selected spinner item. (Note that this is not the same as setting the spinner position (with setSelection()).

I was thinking of doing this with

tUnitAdapter.getView(position, ?, ?).setText("new text");

Am I on the right track? What to put as second ("convertView") and third ("parent") argument in getView. My spinner adapter looks like:

public class SpinnerUnitAdapter extends ArrayAdapter<Unit> {
     ...
     @Override
     public View getView(int position, View convertView, ViewGroup parent) {
         TextView label = new TextView(mContext);
         label.setTextColor(Color.BLACK);                        
       label.setTextSize(mContext.getResources().getDimension(R.dimen.list_row_font_size));
         label.setGravity(Gravity.CENTER);
         label.setText(getItem(position).getName());

         return label;
    }
}

Solution

  • Am I on the right track?

    No. You should do the following steps: (in the onItemSelected method)

    • Update your model (the array of items you passed to the adapter) so that the item at position index takes the new name.

    • Issue notifyDataSetChanged on the adapter object. Alternatively, you can do this manually by ((TextView) view).setText(new_name);

    Note: In onItemSelected method, adapterView points to your spinner view and view points to the row view just selected.


    UPDATE #1

    public void onItemSelected(AdapterView<?> adapterView, View view, int position, long id) {
        ((TextView) view).setText("new name");
    }
    

    UPDATE #2

    For this, you should use Java interface to implement a callback which is called once the dialog is closed.

    public void onItemSelected(AdapterView<?> adapterView, final View view, int position, long id) {
        Dialog dialog = new MyDialog(context, new MyDialog.OnItemSelectListener(){
            @Override
            public void onItemSelected(String newName){
                ((TextView) view).setText(newName);
            }
        });
        dialog.show();
    }
    

    And declare interface OnItemSelectListener in your MyDialog class.