Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to hide one item in an Android Spinner

I am looking for a way to hide one item in an Android spinner widget. This would allow you to simulate a spinner with no items selected, and ensures that the onItemSelected() callback is always called for every item selected (if the hidden item is the "current" one). Normally there is always one item in the spinner that doesn't generate a callback, namely the current one.

There is some code on stackoverflow for how to disable (gray out) items, but not how to hide items completely as if they don't exist.

After much experimentation I've come up with a somewhat hack-ish solution that works on various old and new Android platforms. It has some minor cosmetic drawbacks which are hard to notice. I'd still like to hear of a more official solution, other than "don't do that with a spinner".

This always hides the first item in the spinner, but could fairly easily be extended to hide an arbitrary item or more than one item. Add a dummy item containing an empty string at the start of your list of spinner items. You may want to set the current spinner selection to item 0 before the spinner dialog opens, this will simulate an unselected spinner.

Spinner setup example with ArrayAdapter method override:

List<String> list = new ArrayList<String>(); list.add("");   //  Initial dummy entry list.add("string1"); list.add("string2"); list.add("string3");  // Populate the spinner using a customized ArrayAdapter that hides the first (dummy) entry ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, list) {     @Override     public View getDropDownView(int position, View convertView, ViewGroup parent)     {         View v = null;          // If this is the initial dummy entry, make it hidden         if (position == 0) {             TextView tv = new TextView(getContext());             tv.setHeight(0);             tv.setVisibility(View.GONE);             v = tv;         }         else {             // Pass convertView as null to prevent reuse of special case views             v = super.getDropDownView(position, null, parent);         }          // Hide scroll bar because it appears sometimes unnecessarily, this does not prevent scrolling          parent.setVerticalScrollBarEnabled(false);         return v;     } };  dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); mySpinner.setAdapter(dataAdapter); 
like image 361
Georgie Avatar asked Mar 25 '12 19:03

Georgie


1 Answers

To hide an arbitrary item or more than one item I think that you can implement your own adapter and set the index (or array list of indexes) that you want to hide.

public class CustomAdapter extends ArrayAdapter<String> {       private int hidingItemIndex;       public CustomAdapter(Context context, int textViewResourceId, String[] objects, int hidingItemIndex) {          super(context, textViewResourceId, objects);          this.hidingItemIndex = hidingItemIndex;      }       @Override      public View getDropDownView(int position, View convertView, ViewGroup parent) {          View v = null;          if (position == hidingItemIndex) {              TextView tv = new TextView(getContext());              tv.setVisibility(View.GONE);              v = tv;          } else {              v = super.getDropDownView(position, null, parent);          }          return v;      }  } 

And use your custom adapter when you create the list of items.

List<String> list = new ArrayList<String>(); list.add("");   //  Initial dummy entry list.add("string1"); list.add("string2"); list.add("string3");  int hidingItemIndex = 0;  CustomAdapter dataAdapter = new CustomAdapter(this, android.R.layout.simple_spinner_item, list, hidingItemIndex);  dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); mySpinner.setAdapter(dataAdapter); 

(I have not tested the code) hope that helps.

like image 80
Aebsubis Avatar answered Sep 30 '22 14:09

Aebsubis