Hallo leute, ich versuche gerade einen eigenen ArrayAdapter für einen Spinner zu bauen. Soweit funktioniert alles, bis auf die Optik, die bekomme ich einfach nicht so hin wie ich das möchte.
Weshalb ich einen eigenen bauen MUSS ist einfach, gefüttert wird der Spinner mit einer localeList...
in einer Locale steht nur die Abkürtung der Landessprache und evtl. noch ein Länderkürzel drin ( z.B. en_GB )
Benutze ich folgenden einfachen Code, indem ich einfach einen ArrayAdapter benutz...
ArrayAdapter<Locale> adapter = new ArrayAdapter<Locale>(this, R.layout.custom_spinner_item_languages, localeList);
adapter.setDropDownViewResource(R.layout.custom_spinner_checkbox_item);
localeComboBox = (Spinner) mContext.findViewById(R.id.spinLanguages);
localeComboBox.setAdapter(adapter);
sieht mein Ergebnis folgendermaßen aus...
[Blockierte Grafik: http://preview.slick.pics/FUZT8oD1j.png]
Die Optik ist hier genau so wie ich es möchte... ist der Spinner zugeklappt ist die Schrift weiß. Quelle -> R.layout.custom_spinner_item_languages
Doch die DropDownElemente sind blau, mit einer Checkbox
Quelle -> R.layout.custom_spinner_checkbox_item
Der Haken dabei ist das ich dem ArrayAdapter den ich benutzt habe nicht sagen kann das er statt dem Sprachkürzel der Locale die ausgeschriebene Variante nehmen soll. Deshalb habe ich selbst einen ArrayAdapter gebaut.
CustomSpinnerAdapterLanguage adapter = new CustomSpinnerAdapterLanguage(Language.this, R.layout.custom_spinner_item_languages, localeList);
adapter.setDropDownViewResource(R.layout.custom_spinner_checkbox_item);
localeComboBox = (Spinner) mContext.findViewById(R.id.spinLanguages);
localeComboBox.setAdapter(adapter);
Der CustomSpinnerAdapterLanguage bekommt die selben Layouts wie vorhin der der Standardlibrary.
public class CustomSpinnerAdapterLanguage extends ArrayAdapter<Locale> {
Context context;
int layoutResID;
List<Locale> spinnerData;
public CustomSpinnerAdapterLanguage(Context context, int layoutResourceID, int textViewResourceId, List<Locale> spinnerDataList) {
super(context, -1, textViewResourceId, spinnerDataList);
this.context = context;
this.layoutResID = layoutResourceID;
this.spinnerData = spinnerDataList;
}
public CustomSpinnerAdapterLanguage(Context context, int layoutResourceID, List<Locale> spinnerDataList) {
super(context, layoutResourceID, spinnerDataList);
this.context = context;
this.layoutResID = layoutResourceID;
this.spinnerData = spinnerDataList;
}
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
return getCustomView(position, convertView, parent);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
return getCustomView(position, convertView, parent);
}
public View getCustomView(int position, View convertView, ViewGroup parent) {
View row = convertView;
SpinnerHolder holder;
if (row == null) {
LayoutInflater inflater = ((Activity) context).getLayoutInflater();
row = inflater.inflate(layoutResID, parent, false);
holder = new SpinnerHolder();
holder.locale = (TextView) row.findViewById(R.id.tvLanguage_spinnerItem);
row.setTag(holder);
}
else {
holder = (SpinnerHolder) row.getTag();
}
Locale item = spinnerData.get(position);
if (!item.getCountry().equalsIgnoreCase(""))
holder.locale.setText(item.getDisplayLanguage() + ", " + item.getDisplayCountry());
else
holder.locale.setText(item.getDisplayLanguage());
return row;
}
private static class SpinnerHolder {
TextView locale;
}
}
Alles anzeigen
Mein Probelm wird darin liegen das ich der row die falsche layoutResId gebe ( Zeile 32 ) Ich habe aber keine Ahnung wie ich es anders machen soll. Das Ergebnis sieht folgendermaßen aus... Aufgrund das ich in Zeile 42 und 44 die Methode getDisplayLanguage der Locale benutze.
[Blockierte Grafik: http://preview.slick.pics/FUZT8oKrn.png]
Dieses mal passt der Text, und das Layout wenn der Spinner zugeklappt ist. Allerdings nimmt er dieses Layout ebenfalls für die DropDown Elemente
ich habe zwar, wie unter Bild 1 zu sehen ist, mit adapter.setDropDownViewResource(R.layout.custom_spinner_checkbox_item) das korrekte Layout gesetzt, aber das wird vollkommen ignoriert.
Vielleicht weiss jemand Rat, wie ich meine ArrayAdapter Klasse wohl verändern muss damit ich verschiedene Layouts für DropDown und nicht-DropDown Elemente setzen kann..