Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Example of custom setDropDownViewResource spinner item

I would like to display two values in an drop down view of my spinner.

Currently, it only has a city name, but I would also like to add a small distance field to it.

    MyCity<MyCityDistance> dataAdapter;  

    dataAdapter = new MyCity(this, R.layout.mycityrow, list);
    dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

I have all the code for custom data adapter, exapanding my view and holder etc.

However, the item which gets show doesn't display both the city and its distance from my current location.

It only shows what is overridden in toString() method of MyCityDistance class.

I even tried setting

dataAdapter.setDropDownViewResource(R.layout.mycityrow);

but, no success. It throws an error.

04-02 11:05:22.600: E/AndroidRuntime(367): java.lang.IllegalStateException: ArrayAdapter requires the resource ID to be a TextView
04-02 11:05:22.600: E/AndroidRuntime(367):  at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:347)
04-02 11:05:22.600: E/AndroidRuntime(367):  at android.widget.ArrayAdapter.getDropDownView(ArrayAdapter.java:376)
04-02 11:05:22.600: E/AndroidRuntime(367):  at android.widget.Spinner$DropDownAdapter.getDropDownView(Spinner.java:332)

What is a good example of creating your own custom setDropDownViewResource()?

Even if I comment out the setDropDownViewResource() line, I get the same error.

Note: The only effect mycityrow current is that the first element of Spinner is show as per the layout of mycityrow. However, when I click open the drop down, that layout is lost. I want the same layout during drop down selection too.

like image 705
Kapil D Avatar asked Apr 02 '12 03:04

Kapil D


People also ask

What is spinner in Android with example?

Spinners provide a quick way to select one value from a set. In the default state, a spinner shows its currently selected value. Touching the spinner displays a dropdown menu with all other available values, from which the user can select a new one.

What is Simple_spinner_item?

simple_spinner_item is the layout of each drop-down item on the spinner list. And inorder to house these x number of drop-down items, the layout required is simple_spinner_dropdown_item.


1 Answers

Note the below example uses the inbuilt android.R.layout.simple_list_item_2, Unfortunately the text color will probably be the same as the background. You can simply solve this by creating your own custom view and use it in the adapter instead.

Let me know if i should explain any part of it.

public class MainActivity extends Activity {

    class City {
        public City(String city, int d) {
            this.city = city;
            this.distance = String.valueOf(d);
        }

        String city;
        String distance;
    }

    class CityAdapter extends ArrayAdapter<City> {

        public CityAdapter(Context context, List<City> objects) {
            super(context, android.R.layout.simple_list_item_2, objects);
        }

        @Override //don't override if you don't want the default spinner to be a two line view
        public View getView(int position, View convertView, ViewGroup parent) {
            return initView(position, convertView);
        }

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

        private View initView(int position, View convertView) {
            if(convertView == null)
                convertView = View.inflate(getContext(),
                                           android.R.layout.simple_list_item_2,
                                           null);
            TextView tvText1 = (TextView)convertView.findViewById(android.R.id.text1);
            TextView tvText2 = (TextView)convertView.findViewById(android.R.id.text2);
            tvText1.setText(getItem(position).city);
            tvText2.setText(getItem(position).distance);
            return convertView;
        }
    }

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Spinner spinner = (Spinner)findViewById(R.id.spinner1);
        List<City> list = new ArrayList<MainActivity.City>();
        for(int i = 0; i < 10; i++)
            list.add(new City(String.format("City %d", i + 1), (i + 1) * 1000));
        spinner.setAdapter(new CityAdapter(this, list));

    }

}
like image 53
st0le Avatar answered Sep 22 '22 14:09

st0le