Reputation: 37701
I need to change the text size and orientation of the selected item shown on a spinner, but also I need to continue using the default layout for the spinner: android.R.layout.simple_spinner_item
Why? Because if I use personalized layout, I can't load dynamically generated arrays of strings on the spinner. It is a fail of Android :S
can someone help me please?
Upvotes: 1
Views: 1083
Reputation: 8117
Ok, so it's a little tricky, but not too hard.
SimpleAdapter
, creating a custom adapter. SpinnerAdapter
in this new adapter. (if you are using Eclipse, let it help you by creating unimplemented methods)SpinnerAdapter
will force you to add a dropdown view resource xml object. Add it statically, or define a setter.public View getView(int position, View convertView, ViewGroup parent)
(which is where you return a custom view to the Spinner), call parent.getSelectedItem()
to see if it is the same as the item at position
in your list.To use the adapter, call something like this from your Activity:
MyCustomSpinnerAdapter adapter = new MyCustomSpinnerAdapter(this, myListOfItems);
adapter.setDropDownViewResource(R.layout.my_dropdown_view_resource);
mySpinner.setAdapter(adapter);
To see how google does it, take a look in google codesearch here and search for "Android ArrayAdapter.java" - Click on the core/java/android/widget link and it'll take you to the package that has all the various adapters, interfaces and widgets that you need to figure the rest out.
Good luck.
EDIT: Here is an untested first crack at it as an example:
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Spinner;
import android.widget.SpinnerAdapter;
import android.widget.TextView;
import com.beget.consumer.R;
public class MyCustomSpinnerAdapter extends BaseAdapter implements SpinnerAdapter {
private String[] list;
private Context context;
public MyCustomSpinnerAdapter(Context context, String[] list) {
super();
this.list = list;
this.context = context;
// TODO Auto-generated constructor stub
}
@Override
public int getCount() {
return list.length;
}
@Override
public Object getItem(int position) {
//you need to add index safety here - make sure that position is a valid index
return list[position];
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = context.inflate(R.layout.my_view_item, null);
holder = new ViewHolder();
holder.myView = (TextView) convertView.findViewById(R.id.beget_box_description);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
if (list[position] == ((Spinner) parent).getSelectedItem()) {
holder.myView.setTextSize(25);
} else {
holder.myView.setTextSize(15);
}
holder.myView.setText(list[position]);
return convertView;
}
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
//change this if you want a different view for your dropdown list. It's the same as above, except you could
//inflate a different view if you wanted.
return getView(position, convertView, parent);
}
static class ViewHolder {
TextView myView;
}
}
Upvotes: 1