Ich habe viele gute Lösungen für dieses Problem gefunden. Die meisten funktionieren, indem man ein Element am Ende des Adapters hinzufügt und das letzte Element in der Dropdown-Liste nicht anzeigt. Das große Problem für mich war der Spinner Dropdown-Liste wird vom unteren Rand der Liste starten. So Benutzer sehen die letzten Elemente anstelle der ersten Elemente (im Falle von haben viele Elemente zu zeigen), nach Berührung der Spinner zum ersten Mal.
Also setze ich den Hinweis an den Anfang der Liste und blende den ersten Eintrag in der Dropdown-Liste aus.
private void loadSpinner(){
HintArrayAdapter hintAdapter = new HintArrayAdapter<String>(context, 0);
hintAdapter.add("Hint to be displayed");
hintAdapter.add("Item 1");
hintAdapter.add("Item 2");
.
.
hintAdapter.add("Item 30");
spinner1.setAdapter(hintAdapter);
//spinner1.setSelection(0); //display hint. Actually you can ignore it, because the default is already 0
//spinner1.setSelection(0, false); //use this if don't want to onItemClick called for the hint
spinner1.setOnItemSelectedListener(yourListener);
}
private class HintArrayAdapter<T> extends ArrayAdapter<T> {
Context mContext;
public HintArrayAdapter(Context context, int resource) {
super(context, resource);
this.mContext = context
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(android.R.layout.simple_spinner_item, parent, false);
TextView texview = (TextView) view.findViewById(android.R.id.text1);
if(position == 0) {
texview.setText("");
texview.setHint(getItem(position).toString()); //"Hint to be displayed"
} else {
texview.setText(getItem(position).toString());
}
return view;
}
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
View view;
if(position == 0){
view = inflater.inflate(R.layout.spinner_hint_list_item_layout, parent, false); // Hide first row
} else {
view = inflater.inflate(android.R.layout.simple_spinner_dropdown_item, parent, false);
TextView texview = (TextView) view.findViewById(android.R.id.text1);
texview.setText(getItem(position).toString());
}
return view;
}
}
das folgende Layout in @Override getDropDownView() einstellen, wenn Position 0 ist, um die erste Hinweiszeile auszublenden.
R.layout.spinner_hint_list_item_layout:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
</LinearLayout>
7 Stimmen
Die perfekte Lösung liegt in dieser Frage: stackoverflow.com/questions/9863378/ Überschreiben Sie einfach die Methode getDropDownView().
0 Stimmen
Haben Sie versucht, das erste Element Ihres Adapters auf "Select One" einzustellen?
0 Stimmen
[Hier eine andere tolle, schöne Lösung!][1] [1]: stackoverflow.com/questions/9863378/
0 Stimmen
Wiederverwendbare Spinner : github.com/henrychuangtw/ReuseSpinner
1 Stimmen
Android--code.blogspot.in/2015/08/Android-spinner-hint.html ein weiteres gutes Tutorial
0 Stimmen
Theres eine weit bessere Lösung - Verwenden Sie AutocompleteTextView, und setzen Sie clickable und focusable auf false. Fügen Sie die Elemente als Vorschläge Liste. Wickeln Sie die AutocompleteTextView in einem TextInputLayout und Sie können einen Hinweis festlegen. So wird der Hinweis zunächst angezeigt, und wenn Sie darauf klicken, wird die Liste der Vorschläge (Ihre Elemente) angezeigt. Die klickbare und fokussierbare auf false wird die Tastatur aus popping-out und jede manuelle Eingabe zu verhindern, im Grunde macht es eine perfekte Dropdown-Menü.