Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android Custom Spinner not Populating

Having trouble getting my spinner to populate. Well, I was getting it to populate just fine with a string array from strings.xml but now I want to add a custom font to the array. I'm using a Custom ArrayAdapter for the first time and it is overwriting my "android:entries=" and "android:prompt=" inside its layout xml.

So, I need to populate this spinner with an array from my strings.xml

(Inside onCreate)

    spinner1 = (Spinner) findViewById(R.id.distancespinner);
    MyArrayAdapter ma = new MyArrayAdapter(this, R.layout.my_spinner_style);
    spinner1.setAdapter(ma);

Then:

 private class MyArrayAdapter extends ArrayAdapter {

    Typeface font = Typeface.createFromAsset(getAssets(), "fonts/m01.TTF");  

    public MyArrayAdapter(Context context, int textViewResourceId) {
    super(context, textViewResourceId);
    }

    public TextView getView(int position, View convertView, ViewGroup parent) {
    TextView v = (TextView) super.getView(position, convertView, parent);
    v.setTypeface(font);
    return v;
    }

    public TextView getDropDownView(int position, View convertView, ViewGroup parent) {
    TextView v = (TextView) super.getView(position, convertView, parent);
    v.setTypeface(font);
    return v;
    }

    }

I tried adding the entries and prompt again inside the my_spinner_style.xml...

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/spinnerTarget"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:entries="@array/location_arrays"
android:prompt="@string/location_prompt"
android:singleLine="True" />

But, that is not working either.

like image 471
cerealspiller Avatar asked Aug 05 '26 16:08

cerealspiller


2 Answers

Maybe this is a little late. After I implement your code and some additional test, I think I finally get the answer. The KEY problem the spinner not populating is:

You set the entries of the spinner within the xml file but replace it programmatically with an EMPTY adapter.

I have tried the following ways to populate the spinner with different results:

  1. Set the entries in xml without any adapter.

    <Spinner 
    android:id="@+id/simple_spinner2"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:entries="@array/simpleStringArray"
    android:prompt="@string/simplePrompt"/>
    

    It populates the spinner with right content without any additional style.

  2. Set the entries in xml with another adapter set to the spinner (as you did in the question)

    in .xml

    <Spinner 
    android:id="@+id/simple_spinner2"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:entries="@array/simpleStringArray"
    android:prompt="@string/simplePrompt"/>
    

    in .java:

    Spinner mySpinner2 = (Spinner) findViewById(R.id.simple_spinner2);
    MySpinnerAdapter2 spinnerAdapter2 = new MySpinnerAdapter2(this, R.layout.simple_list_item);
    

    It displays an empty spinner.

  3. set the data programmatically to adapter

    in .xml

    in .java setContentView(R.layout.activity_spinner);

    Spinner mySpinner2 = (Spinner) findViewById(R.id.simple_spinner2);
    MySpinnerAdapter2 spinnerAdapter2 = new MySpinnerAdapter2(this, R.layout.simple_list_item);
    spinnerAdapter2.addAll(items2);
    

    private class MySpinnerAdapter2 extends ArrayAdapter {

    public MySpinnerAdapter2(Context context, int textViewResourceId) {
        super(context, textViewResourceId);
    }
    
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        TextView v = (TextView) super.getView(position, convertView, parent);
        v.setTextColor(Color.BLUE);
        return v;
    }
    
    @Override
    public View getDropDownView(int position, View convertView, ViewGroup parent) {
        Typeface myFont = Typeface.createFromAsset(getAssets(), "fonts/Igualb.ttf");
        TextView v = (TextView) super.getDropDownView(position, convertView, parent);
        v.setTextColor(Color.RED);
        v.setTypeface(myFont);
        return v;
    }
    

It displays the content correctly with cumtom-set font.

You can check for the complete project in this github repository if you like to.

Wish this helps.

like image 169
J Jiang Avatar answered Aug 07 '26 05:08

J Jiang


That's the code I rewrote and it's working fine:

Spinner spinner = (Spinner) findViewById(R.id.distancespinner);
spinner.setPromptId(R.string.location_prompt);
MyArrayAdapter ma = new MyArrayAdapter(this, R.layout.my_spinner_style);
ma.addAll(Arrays.asList(getResources().getStringArray(
        R.array.location_arrays)));
spinner.setAdapter(ma);

And the XML

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/spinnerTarget"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:singleLine="True" />

Adapter is the same.

like image 26
Maxim Efimov Avatar answered Aug 07 '26 07:08

Maxim Efimov



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!