Если вы хотите, есть decorater spinner. Адаптер автоматически добавляет значение по умолчанию:
protected class SpinnerAdapterWithNoValue implements SpinnerAdapter {
private SpinnerAdapter _current;
private final static String defaultValue = "Choisir";
public SpinnerAdapterWithNoValue(SpinnerAdapter base) {
_current = base;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return _current.getCount()+1;
}
@Override
public Object getItem(int arg0) {
// TODO Auto-generated method stub
if(arg0 == 0 || arg0 == -1)
{
return null;
}
return _current.getItem(arg0-1);
}
@Override
public long getItemId(int arg0) {
// TODO Auto-generated method stub
if(arg0 == 0 || arg0 == -1)
{
return -1;
}
return _current.getItemId(arg0-1);
}
@Override
public int getItemViewType(int arg0) {
// TODO Auto-generated method stub
if(arg0 == 0 || arg0 == -1)
{
return -1;
}
return _current.getItemViewType(arg0-1);
}
@Override
public View getView(int arg0, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
if(arg0 == 0 || arg0 == -1)
{
final TextView v = (TextView) ((LayoutInflater)getContext()
.getSystemService(Context.LAYOUT_INFLATER_SERVICE))
.inflate(R.layout.spinner_text,parent,false);
v.setText(defaultValue);
return v;
}
return _current.getView(arg0-1, convertView, parent);
}
@Override
public int getViewTypeCount() {
// TODO Auto-generated method stub
return _current.getViewTypeCount();
}
@Override
public boolean hasStableIds() {
// TODO Auto-generated method stub
return _current.hasStableIds();
}
@Override
public boolean isEmpty() {
// TODO Auto-generated method stub
return _current.isEmpty();
}
@Override
public void registerDataSetObserver(DataSetObserver arg0) {
// TODO Auto-generated method stub
_current.registerDataSetObserver(arg0);
}
@Override
public void unregisterDataSetObserver(DataSetObserver arg0) {
// TODO Auto-generated method stub
_current.unregisterDataSetObserver(arg0);
}
@Override
public View getDropDownView(int arg0, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
if(arg0 == 0 || arg0 == -1)
{
CheckedTextView v = (CheckedTextView)((LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(android.R.layout.simple_spinner_dropdown_item,parent,false);
v.setText(defaultValue);
return v;
}
return _current.getDropDownView(arg0-1, convertView, parent);
}
}
Затем вы можете создать свой собственный счетчик, используя этот декоратор:
public class SpinnerWithNoValue extends Spinner {
public SpinnerWithNoValue(Context context) {
super(context);
}
public SpinnerWithNoValue(Context context, AttributeSet attrs) {
super(context, attrs);
}
public SpinnerWithNoValue(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
public void setAdapter(SpinnerAdapter orig ) {
final SpinnerAdapter adapter = new SpinnerAdapterWithNoValue(orig);
super.setAdapter(adapter);
try {
final Method m = AdapterView.class.getDeclaredMethod("setNextSelectedPositionInt",int.class);
m.setAccessible(true);
m.invoke(this,-1);
final Method n = AdapterView.class.getDeclaredMethod("setSelectedPositionInt",int.class);
n.setAccessible(true);
n.invoke(this,-1);
} catch( Exception e ) {
throw new RuntimeException(e);
}
}
/*
* getSelectedItem
* renvoi null si la valeur par defaut est séléctionnée
* @see android.widget.AdapterView#getSelectedItem()
*/
@Override
public Object getSelectedItem()
{
return super.getSelectedItem();
}
}
необходимо изменить объявление счетчика в макете XML:
com.myproject.SpinnerWithNoValue
При желании вы можете изменить код, чтобы установить текст по умолчанию в теге счетчика.
Если выбранозначение является значением по умолчанию, getItem вернет ноль, а getItemId вернет -1