Was Sie tun können, ist die Dekoration Ihrer SpinnerAdapter
mit einer, die eine 'Select Option...' präsentiert Ansicht, damit der Spinner zunächst ohne Auswahl angezeigt wird.
Hier ist ein funktionierendes Beispiel für Android 2.3 und 4.0 getestet (es verwendet nichts in der Kompatibilitätsbibliothek, so sollte es für eine Weile in Ordnung sein) Da es ein Dekorator ist, sollte es einfach sein, bestehenden Code nachzurüsten und es funktioniert gut mit CursorLoader
s auch. (Tauschen Sie den Cursor auf dem umwickelten cursorAdapter
natürlich...)
Es gibt einen Android-Fehler, der die Wiederverwendung von Ansichten etwas erschwert. (Sie müssen also die setTag
oder etwas anderes, um sicherzustellen, dass Ihr convertView
ist korrekt). Spinner unterstützt nicht mehrere Ansichtstypen
Anmerkungen zum Code: 2 Konstrukteure
Auf diese Weise können Sie eine Standard-Eingabeaufforderung verwenden oder Ihre eigene Eingabeaufforderung "nichts ausgewählt" als erste Zeile definieren, oder beides, oder keine. (Hinweis: Einige Themen zeigen ein DropDown für einen Spinner anstelle eines Dialogs. Das Dropdown zeigt die Eingabeaufforderung normalerweise nicht an)
Sie definieren ein Layout, das wie eine Eingabeaufforderung aussieht, z. B. ausgegraut...
Verwendung einer Standard-Eingabeaufforderung (beachten Sie, dass nichts ausgewählt ist):
Oder mit einem Prompt und etwas Dynamischem (es hätte auch ohne Prompt gehen können):
Verwendung im obigen Beispiel
Spinner spinner = (Spinner) findViewById(R.id.spinner);
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.planets_array, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setPrompt("Select your favorite Planet!");
spinner.setAdapter(
new NothingSelectedSpinnerAdapter(
adapter,
R.layout.contact_spinner_row_nothing_selected,
// R.layout.contact_spinner_nothing_selected_dropdown, // Optional
this));
kontakt_spinner_reihe_nichts_ausgewaehlt.xml
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
style="?android:attr/spinnerItemStyle"
android:singleLine="true"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="marquee"
android:textSize="18sp"
android:textColor="#808080"
android:text="[Select a Planet...]" />
NothingSelectedSpinnerAdapter.java
import android.content.Context;
import android.database.DataSetObserver;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListAdapter;
import android.widget.SpinnerAdapter;
/**
* Decorator Adapter to allow a Spinner to show a 'Nothing Selected...' initially
* displayed instead of the first choice in the Adapter.
*/
public class NothingSelectedSpinnerAdapter implements SpinnerAdapter, ListAdapter {
protected static final int EXTRA = 1;
protected SpinnerAdapter adapter;
protected Context context;
protected int nothingSelectedLayout;
protected int nothingSelectedDropdownLayout;
protected LayoutInflater layoutInflater;
/**
* Use this constructor to have NO 'Select One...' item, instead use
* the standard prompt or nothing at all.
* @param spinnerAdapter wrapped Adapter.
* @param nothingSelectedLayout layout for nothing selected, perhaps
* you want text grayed out like a prompt...
* @param context
*/
public NothingSelectedSpinnerAdapter(
SpinnerAdapter spinnerAdapter,
int nothingSelectedLayout, Context context) {
this(spinnerAdapter, nothingSelectedLayout, -1, context);
}
/**
* Use this constructor to Define your 'Select One...' layout as the first
* row in the returned choices.
* If you do this, you probably don't want a prompt on your spinner or it'll
* have two 'Select' rows.
* @param spinnerAdapter wrapped Adapter. Should probably return false for isEnabled(0)
* @param nothingSelectedLayout layout for nothing selected, perhaps you want
* text grayed out like a prompt...
* @param nothingSelectedDropdownLayout layout for your 'Select an Item...' in
* the dropdown.
* @param context
*/
public NothingSelectedSpinnerAdapter(SpinnerAdapter spinnerAdapter,
int nothingSelectedLayout, int nothingSelectedDropdownLayout, Context context) {
this.adapter = spinnerAdapter;
this.context = context;
this.nothingSelectedLayout = nothingSelectedLayout;
this.nothingSelectedDropdownLayout = nothingSelectedDropdownLayout;
layoutInflater = LayoutInflater.from(context);
}
@Override
public final View getView(int position, View convertView, ViewGroup parent) {
// This provides the View for the Selected Item in the Spinner, not
// the dropdown (unless dropdownView is not set).
if (position == 0) {
return getNothingSelectedView(parent);
}
return adapter.getView(position - EXTRA, null, parent); // Could re-use
// the convertView if possible.
}
/**
* View to show in Spinner with Nothing Selected
* Override this to do something dynamic... e.g. "37 Options Found"
* @param parent
* @return
*/
protected View getNothingSelectedView(ViewGroup parent) {
return layoutInflater.inflate(nothingSelectedLayout, parent, false);
}
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
// Android BUG! http://code.google.com/p/android/issues/detail?id=17128 -
// Spinner does not support multiple view types
if (position == 0) {
return nothingSelectedDropdownLayout == -1 ?
new View(context) :
getNothingSelectedDropdownView(parent);
}
// Could re-use the convertView if possible, use setTag...
return adapter.getDropDownView(position - EXTRA, null, parent);
}
/**
* Override this to do something dynamic... For example, "Pick your favorite
* of these 37".
* @param parent
* @return
*/
protected View getNothingSelectedDropdownView(ViewGroup parent) {
return layoutInflater.inflate(nothingSelectedDropdownLayout, parent, false);
}
@Override
public int getCount() {
int count = adapter.getCount();
return count == 0 ? 0 : count + EXTRA;
}
@Override
public Object getItem(int position) {
return position == 0 ? null : adapter.getItem(position - EXTRA);
}
@Override
public int getItemViewType(int position) {
return 0;
}
@Override
public int getViewTypeCount() {
return 1;
}
@Override
public long getItemId(int position) {
return position >= EXTRA ? adapter.getItemId(position - EXTRA) : position - EXTRA;
}
@Override
public boolean hasStableIds() {
return adapter.hasStableIds();
}
@Override
public boolean isEmpty() {
return adapter.isEmpty();
}
@Override
public void registerDataSetObserver(DataSetObserver observer) {
adapter.registerDataSetObserver(observer);
}
@Override
public void unregisterDataSetObserver(DataSetObserver observer) {
adapter.unregisterDataSetObserver(observer);
}
@Override
public boolean areAllItemsEnabled() {
return false;
}
@Override
public boolean isEnabled(int position) {
return position != 0; // Don't allow the 'nothing selected'
// item to be picked.
}
}
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ü.