608 Stimmen

Wie erstellt man einen Android Spinner mit dem Anfangstext "Select One"?

Ich möchte einen Spinner verwenden, der zunächst (wenn der Benutzer noch keine Auswahl getroffen hat) den Text "Select One" anzeigt. Wenn der Benutzer auf den Spinner klickt, wird die Liste der Elemente angezeigt und der Benutzer wählt eine der Optionen aus. Nachdem der Benutzer eine Auswahl getroffen hat, wird das ausgewählte Element im Spinner anstelle von "Select One" angezeigt.

Ich habe den folgenden Code, um einen Spinner zu erstellen:

String[] items = new String[] {"One", "Two", "Three"};
Spinner spinner = (Spinner) findViewById(R.id.mySpinner);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
            android.R.layout.simple_spinner_item, items);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);

Mit diesem Code wird zunächst das Element "Eins" angezeigt. Ich könnte einfach ein neues Element "Select One" zu den Elementen hinzufügen, aber dann würde "Select One" auch in der Dropdown-Liste als erstes Element angezeigt werden, was ich nicht möchte.

Wie kann ich dieses Problem beheben?

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/

32voto

Ich habe diese Lösung gefunden:

String[] items = new String[] {"Select One", "Two", "Three"};
Spinner spinner = (Spinner) findViewById(R.id.mySpinner);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
            android.R.layout.simple_spinner_item, items);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);

spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
    @Override
    public void onItemSelected(AdapterView<?> arg0, View arg1, int position, long id) {
        items[0] = "One";
        selectedItem = items[position];
    }

    @Override
    public void onNothingSelected(AdapterView<?> arg0) {
    }
});

Ändern Sie einfach das Array[0] mit "Select One" und benennen Sie es dann im onItemSelected in "One" um.

Nicht gerade eine elegante Lösung, aber sie funktioniert :D

6 Stimmen

Das hat bei mir nicht funktioniert. Nachdem ich "Eins" ausgewählt habe, heißt es immer noch "Eins auswählen".

0 Stimmen

Dies wird nicht funktionieren, da die Schnittstelle onItemSelected immer zum ersten Mal aufgerufen wird.

24voto

mjancola Punkte 419

Hier gibt es viele Antworten, aber ich bin überrascht, dass niemand eine einfache Lösung vorgeschlagen hat: Legen Sie eine TextView über den Spinner. Setzen Sie einen Click-Listener auf die TextView, die die TextView zeigt den Spinner versteckt, und ruft spinner.performClick().

1 Stimmen

Das ist meine Lieblingsantwort. Danke!

0 Stimmen

Dieser Ansatz hat ein kleines Problem! Dazu müssen Sie die Breite der Textansicht auf die Breite des Spinners einstellen. Dadurch verschwindet das Pfeilsymbol des Spinners! Abhilfe kann man schaffen, indem man die Anzahl der Ebenen erhöht, z. B. indem man eine Ebene für den Pfeil und ein lineares Layout für die Textansicht und die Pfeilebene hinzufügt.

22voto

Yakiv Mospan Punkte 8064

Es gibt keine Standard-API, um einen Hinweis auf Spinner zu setzen. Um es hinzuzufügen, brauchen wir einen kleinen Workaround ohne die nicht sichere Reflection-Implementierung

List<Object> objects = new ArrayList<Object>();
objects.add(firstItem);
objects.add(secondItem);
// add hint as last item
objects.add(hint);

HintAdapter adapter = new HintAdapter(context, objects, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

Spinner spinnerFilmType = (Spinner) findViewById(R.id.spinner);
spinner.setAdapter(adapter);

// show hint
spinner.setSelection(adapter.getCount());

Quelle des Adapters:

public class HintAdapter
        extends ArrayAdapter<Objects> {

    public HintAdapter(Context theContext, List<Object> objects) {
        super(theContext, android.R.id.text1, android.R.id.text1, objects);
    }

    public HintAdapter(Context theContext, List<Object> objects, int theLayoutResId) {
        super(theContext, theLayoutResId, android.R.id.text1, objects);
    }

    @Override
    public int getCount() {
        // don't display last item. It is used as hint.
        int count = super.getCount();
        return count > 0 ? count - 1 : count;
    }
}

Ursprüngliche Quelle

0 Stimmen

Was ist R.id.text1? Ist es ein Layout oder eine Ansicht? Bitte erläutern Sie Ihre Antwort

0 Stimmen

Es sollte sein android.R.id.text1

0 Stimmen

Ich habe einen Zweifel, sah viele Lösungen in diesem Thread..aber warum jeder ist Hinzufügen von Hinweis auf die letzte. Ist es falsch, den Hinweis in der ersten Zeile hinzuzufügen?

9voto

Rajasekhar Punkte 99

Ich habe das gleiche Problem für Spinner, mit einer leeren Auswahl, und ich fand eine bessere Lösung. Werfen Sie einen Blick auf diesen einfachen Code.

Spinner lCreditOrDebit = (Spinner)lCardPayView.findViewById(R.id.CARD_TYPE);
spinneradapter lAdapter = 
  new spinneradapter(
    BillPayScreen.this, 
    ndroid.R.layout.simple_spinner_item,getResources().getStringArray(R.array.creditordebit));
lAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
lCreditOrDebit.setAdapter(lAdapter);

Hier spinneradapter ist eine kleine Anpassung für arrayadapter. Es sieht wie folgt aus:

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;

public class spinneradapter extends ArrayAdapter<String>{
    private Context m_cContext;
    public spinneradapter(Context context,int textViewResourceId, String[] objects) {
        super(context, textViewResourceId, objects);
        this.m_cContext = context;
    }

    boolean firsttime = true;
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if(firsttime){
            firsttime = false;
            //Just return some empty view
            return new ImageView(m_cContext);
        }
        //Let the array adapter take care of it this time.
        return super.getView(position, convertView, parent);
    }
}

6 Stimmen

Das Problem bei diesem Ansatz ist, dass beim Aufklappen der Liste immer noch das erste Element in der Liste ausgewählt wird. Da dieses bereits ausgewählt ist, können Sie es nicht berühren, um es auszuwählen - es verhält sich so, als wäre nichts ausgewählt worden.

8voto

Cabezas Punkte 8203

Das ist mein Weg:

List<String> list = new ArrayList<String>();
list.add("string1");
list.add("string2");
list.add("string3");
list.add("[Select one]");
final int listsize = list.size() - 1;
ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item, list) {
 @Override
public int getCount() {
    return(listsize); // Truncate the list
}
};
dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
mySpinner.setAdapter(dataAdapter);

mySpinner.setSelection(listsize); // Hidden item to appear in the spinner

0 Stimmen

Dies öffnet den Spinner in der unteren Position

0 Stimmen

Nach stundenlanger Arbeit...!!! vielen Dank für die Lösung

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X