Мне нужно изменить размер текста и ориентацию выбранного элемента, показанного на счетчике, но также мне нужно продолжить использование макета по умолчанию для счетчика: android.R.layout.simple_spinner_item
Зачем? Поскольку, если я использую персонализированный макет, я не могу загрузить динамически созданные массивы строк на счетчике. Это неудача Android: S
Может кто-то мне помочь, пожалуйста?
Хорошо, так что это немного сложно, но не слишком сложно.
SimpleAdapter
, создав пользовательский адаптер.SpinnerAdapter
в этом новом адаптере. (если вы используете Eclipse, пусть это поможет вам, создав нереализованные методы)SpinnerAdapter
заставит вас добавить объект xml-ресурса с раскрывающимся SpinnerAdapter
. Добавьте его статически или определите сеттер.public View getView(int position, View convertView, ViewGroup parent)
(в котором вы возвращаете пользовательский вид Spinner) вызовите parent.getSelectedItem()
чтобы увидеть, parent.getSelectedItem()
ли он с position
в вашем списке.Чтобы использовать адаптер, вызовите что-то вроде этого в своей деятельности:
MyCustomSpinnerAdapter adapter = new MyCustomSpinnerAdapter(this, myListOfItems);
adapter.setDropDownViewResource(R.layout.my_dropdown_view_resource);
mySpinner.setAdapter(adapter);
Чтобы увидеть, как Google делает это, посмотрите в Google codesearch здесь и поиск "Android ArrayAdapter.java" - Нажмите на /Java/Android/ссылку основного виджета, и он будет считать вас в пакет, который имеет все различные адаптеры, интерфейсы и виджеты, которые вам нужны, чтобы понять остальную часть.
Удачи.
РЕДАКТИРОВАТЬ: В нем есть непроверенная первая трещина:
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 the same as above, except you could
//inflate a different view if you wanted.
return getView(position, convertView, parent);
}
static class ViewHolder {
TextView myView;
}
}