TheLettuceMaster
TheLettuceMaster

Reputation: 15734

Attempting to customize spinner with adapter

I want to do nothing more than change the font Typeface and size of my spinner text.

I have made some initial attempts. Nothing is crashing, but my spinner is blank. (I also have yet to implement the custom Typeface, I am just trying to get the spinner to work first.

In code:

protected SpinnerSortAdapter sAdapter;
    protected Spinner sort;
    protected String[] strings;

        sort = (Spinner) getActivity().findViewById(R.id.spinner2);
        strings = getActivity().getResources().getStringArray(R.array.sorting_items);
        SpinnerSortAdapter sAdapter = new SpinnerSortAdapter(getActivity(),
                android.R.layout.simple_spinner_item, strings);
        sAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        sort.setAdapter(sAdapter);
        sort.setOnItemSelectedListener(new MyOnItemSelectedListener());

Adapter:

public class SpinnerSortAdapter extends ArrayAdapter<String> {
public SpinnerSortAdapter(Context context, int textViewResourceId,
        String[] strings) {
    super(context, textViewResourceId, strings);
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View view = super.getView(position, convertView, parent);
    if (view instanceof TextView) {
        ((TextView) view).setTextSize(5);
    }
    return view;
}

public View getDropDownView(int position, View convertView, ViewGroup parent) {
    View row = super.getView(position, convertView, parent);
    return (row);
}

}enter code here

Upvotes: 2

Views: 4763

Answers (2)

Sam
Sam

Reputation: 86948

A much easier and faster route is to customize the layouts that you pass to your adapter rather than the adapter itself:

ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(getActivity(), R.layout.spinner_item, R.array.sorting_items);
adapter.setDropDownViewResource(R.layout.spinner_dropdown_item);

Save this as spinner_dropdown_item.xml in res/layout:

<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@android:id/text1"
    style="?android:attr/spinnerDropDownItemStyle"
    android:singleLine="true"
    android:layout_width="fill_parent"
    android:layout_height="?android:attr/listPreferredItemHeight"
    android:ellipsize="marquee" 
    android:textSize="15sp"/>

(I just copied simple_spinner_dropdown_item.xml and added the textSize attribute at the bottom. You should do the same with simple_spinner_item layout.)

This approach is faster because you are not changing any attributes at runtime. The XML is pre-processed. While the custom adapter changes the typeface and size everytime you call getView() or getDropDownView()...

Upvotes: 2

user
user

Reputation: 87064

You're not initializing the adapter correctly. Your version of ArrayAdapter that takes two ints, one pointing to a layout file for the row and an int representing the id of a TextView widget from that layout file. This adapter will be empty. Your code should be like this:

String[] items = getResources().getStringArray(R.array.sorting_items);
SpinnerSortAdapter adapter = new SpinnerSortAdapter(getActivity(), android.R.layout.simple_spinner_item, items);

Also the adapter would be changed to:

 public class SpinnerSortAdapter extends ArrayAdapter<String> {

    public SpinnerSortAdapter(Context context, int textViewResourceId,
            String[] strings) {
        super(context, textViewResourceId, strings);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view = super.getView(position, convertView, parent);
        if (view instanceof TextView) {
            ((TextView) view).setTextSize(5);
        }
        return view;
    }

    public View getDropDownView(int position, View convertView, ViewGroup parent) {
        View row = super.getView(position, convertView, parent);
        return (row);
    }
}

Upvotes: 8

Related Questions