Raf A
Raf A

Reputation: 179

How do I retrieve the string value of my spinner's selected item?

In my spinner, I have the values 'Male', 'Female' and 'Male and female'. If someone clicks 'Male' in the spinner, I'd like to retrieve that value. My existing code which uses spinner.getSelectedItem().toString() provides the following result:

com.example.kitchen.SpinnerItem@64dd10e

I've even tried to implement .setOnItemSelectedListener() but that didn't work either. Main activity code:

public class ManageEventsActivity extends AppCompatActivity {

    String stringCreateEventGender;
    ArrayList<String> arrayUpcomingEventGender = new ArrayList<>();
    ArrayList<SpinnerItem> mGenderList = new ArrayList<>();
    SpinnerAdapter genderAdapter;

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

        spinnerCreateEventGender = findViewById(R.id.spinnerCreateEventGender);

        initGenderList();
        genderAdapter = new SpinnerAdapter(this, mGenderList);
        spinnerCreateEventGender.setAdapter(genderAdapter);
    }

    private void initGenderList() {
        mGenderList.add(new SpinnerItem("Male"));
        mGenderList.add(new SpinnerItem("Female"));
        mGenderList.add(new SpinnerItem("Male and female"));
    }
}

Spinner adapter code:

public class SpinnerAdapter extends ArrayAdapter<SpinnerItem> {

    public SpinnerAdapter(Context context, ArrayList<SpinnerItem> genderList) {
        super(context, 0, genderList);
    }

    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        return initView(position, convertView, parent);
    }

    @Override
    public View getDropDownView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        return initView(position, convertView, parent);
    }

    private View initView(int position, View convertView, ViewGroup parent) {
        if (convertView == null) {
            convertView = LayoutInflater.from(getContext()).inflate(
                    R.layout.spinner_layout, parent, false
            );
        }
        TextView textViewItem = convertView.findViewById(R.id.textViewItem);
        SpinnerItem currentItem = getItem(position);
        if (currentItem != null) {
            textViewItem.setText(currentItem.getItem());
        }
        return convertView;
    }
}

Spinner item code:

public class SpinnerItem {

    String mItem;

    public SpinnerItem(String item) {
        mItem = item;
    }

    public String getItem() {
        return mItem;
    }
}

Upvotes: 1

Views: 51

Answers (2)

Raf A
Raf A

Reputation: 179

Managed to find a solution:

spinnerCreateEventGender.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                spinnerItem = (SpinnerItem) parent.getItemAtPosition(position);
                clickedItem = spinnerItem.getItem();
                Toast.makeText(ManageEventsActivity.this, clickedItem, Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {

            }
        });

Upvotes: 0

Akaki Kapanadze
Akaki Kapanadze

Reputation: 2672

You need to cast object to its original type (also check if it is not null):

@Nullable Object selectedItem = spinner.getSelectedItem();
if (selectedItem != null) { // selectedItem is null if there is nothing selected
    String item = ((SpinnerItem) selectedItem).getItem();
}

Or you should override the toString method in order to return value of the object:

public class SpinnerItem {

    String mItem;

    public SpinnerItem(String item) {
        mItem = item;
    }

    public String getItem() {
        return mItem;
    }

    @NonNull
    @Override
    public String toString() {
        return mItem;
    }
}

and then spinner.getSelectedItem().toString() will provides correct result.

Upvotes: 1

Related Questions