Ich suche nach einer Möglichkeit, ein Element in einem Android-Spinner-Widget auszublenden. Auf diese Weise können Sie einen Spinner ohne ausgewählte Elemente simulieren und sicherstellen, dass der Rückruf onItemSelected () immer für jedes ausgewählte Element aufgerufen wird (wenn das versteckte Element das "aktuelle" ist). Normalerweise befindet sich im Spinner immer ein Element, das keinen Rückruf generiert, nämlich das aktuelle.
Der Stapelüberlauf enthält Code zum Deaktivieren (Ausgrauen) von Elementen, jedoch nicht zum vollständigen Ausblenden von Elementen, als ob sie nicht vorhanden wären.
Nach langem Experimentieren habe ich eine etwas hackige Lösung gefunden, die auf verschiedenen alten und neuen Android-Plattformen funktioniert. Es hat einige kleinere kosmetische Nachteile, die schwer zu bemerken sind. Ich würde immer noch gerne von einer offizielleren Lösung hören, außer "Mach das nicht mit einem Spinner".
Dies verbirgt immer den ersten Gegenstand im Spinner, kann aber ziemlich leicht erweitert werden, um einen beliebigen Gegenstand oder mehr als einen Gegenstand auszublenden. Fügen Sie am Anfang Ihrer Liste der Spinner-Elemente ein Dummy-Element mit einer leeren Zeichenfolge hinzu. Möglicherweise möchten Sie die aktuelle Spinnerauswahl auf Element 0 setzen, bevor das Spinnerdialogfeld geöffnet wird. Dadurch wird ein nicht ausgewählter Spinner simuliert.
Beispiel für die Einrichtung eines Spinners mit Überschreibung der ArrayAdapter-Methode:
List<String> list = new ArrayList<String>();
list.add(""); // Initial dummy entry
list.add("string1");
list.add("string2");
list.add("string3");
// Populate the spinner using a customized ArrayAdapter that hides the first (dummy) entry
ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, list) {
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent)
{
View v = null;
// If this is the initial dummy entry, make it hidden
if (position == 0) {
TextView tv = new TextView(getContext());
tv.setHeight(0);
tv.setVisibility(View.GONE);
v = tv;
}
else {
// Pass convertView as null to prevent reuse of special case views
v = super.getDropDownView(position, null, parent);
}
// Hide scroll bar because it appears sometimes unnecessarily, this does not prevent scrolling
parent.setVerticalScrollBarEnabled(false);
return v;
}
};
dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
mySpinner.setAdapter(dataAdapter);
tv.setVisibility(View.GONE);
Linie ist unnötig. Das Auskommentieren scheint keinen (visuellen) Unterschied zu machen, zumindest unter Android 4.4.2 / KitKit (auf einem LG / Google Nexus 4).setTag(1)
die Textansicht an Position 0 verwendet und dannconvertView.getTag() != null
festgestellt, ob die wiederverwendete Ansicht die für Position 0 erstellte Ansicht mit der Höhe 0 oder eine normale Ansicht für andere Spinnerelemente war. Dies war so, dass ichsuper.getDropDownView(position, convertView, parent)
manchmal verwenden konnte, anstatt immer eine neue Ansicht zu erstellen.Antworten:
Um ein beliebiges Element oder mehr als ein Element auszublenden, können Sie meines Erachtens Ihren eigenen Adapter implementieren und den Index (oder die Array-Liste der Indizes) festlegen, den Sie ausblenden möchten.
Verwenden Sie Ihren benutzerdefinierten Adapter, wenn Sie die Liste der Elemente erstellen.
(Ich habe den Code nicht getestet) hoffe, das hilft.
quelle
Es ist einfacher, ein Element am Ende der Liste auszublenden, indem Sie die Liste abschneiden.
Sie müssen es jedoch zuerst auswählen, damit es im Drehfeld angezeigt wird, und dann prüfen, ob die Auswahl in eines der angezeigten Elemente geändert wurde.
quelle
Um einen Gegenstand in der Spinner-Dropdown-Liste auszublenden, müssen Sie die Position des Gegenstands übergeben, der anhand der erforderlichen Kriterien ausgeblendet werden muss. Ich habe dies in einem Anwendungsfall erreicht, in dem das aus der Dropdown-Liste ausgewählte Element ausgeblendet wurde
Das Einstellen des Adapters ist ungefähr so
Bei Auswahl einiger Elemente aus der Dropdown-Liste muss auch die Position geändert werden
quelle
Nur aus Interesse habe ich eine Lösung gefunden, um "Eingabeaufforderung" als Hinweis zu verwenden. Dieser Code ist wie gemacht
Xamarin.Android
, kann aber in 10 Minuten perfekt auf Java portiert werden. Verwenden Sie es wie ein einfachesArrayAdapter
Element, ohne dem Quellarray Elemente mit 0 oder Zählindex hinzuzufügen. Es wird auchSpinnerGeolocation.SelectedItemId
auf -1 gesetzt , wenn nichts ausgewählt ist (hint
ist das aktuelle Element).quelle
Ich habe diese Lösung gefunden, die mein Problem gelöst hat.
quelle
Ich denke, es ist besser, die Validierung auf die Array-Liste zu setzen, als auf Spinner, da es sicher ist, Spinner hinzuzufügen, sobald das Element gefiltert ist
quelle
Ein anderer Ansatz, der für mich am besten funktioniert hat, ist die Rückgabe eines neuen leeren Ansichtsobjekts. Dies ist ein sehr sauberer Ansatz, da Sie nicht mit Array-Elementen spielen.
Erstellen Sie Ihre Adapterklasse als Erweiterung
ArrayAdapter
innerhalb Ihrer Methode
quelle
Dies ist eine sehr alte Frage, aber ich habe einen schönen (und wahrscheinlich) sauberen Weg gefunden, um auch nicht die ersten Elemente anzuzeigen. Inspiriert von @ Romichs Antwort habe ich eine ähnliche Logik hinzugefügt, um die ersten Elemente zu überspringen.
Dadurch wird eine beliebige Anzahl von Elementen effektiv ausgeblendet (standardmäßig 1). Der Code gibt nur an, dass die Größe der zu rendernden Objekte kürzer ist als sie tatsächlich ist, und ändert auch den Index der zu rendernden Elemente, sodass eine beliebige Anzahl von Elementen übersprungen wird.
Um die Dinge einfach zu halten, habe ich eine Lösung ausgeschlossen, die ich derzeit verwende und die das Ausblenden einer Liste zufälliger Elemente unterstützt, die jedoch durch wenige Änderungen am Code problemlos verwaltet werden kann.
quelle