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 dann convertView.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 ich super.getDropDownView(position, convertView, parent)
manchmal verwenden konnte, anstatt immer eine neue Ansicht zu erstellen.