Sto cercando un modo per nascondere un elemento in un widget di rotazione di Android. Ciò consentirebbe di simulare uno spinner senza elementi selezionati e garantisce che il callback onItemSelected () venga sempre chiamato per ogni elemento selezionato (se l'elemento nascosto è quello "corrente"). Normalmente c'è sempre un elemento nello spinner che non genera un callback, ovvero quello corrente.
C'è del codice su stackoverflow su come disabilitare (in grigio) gli elementi, ma non su come nascondere completamente gli elementi come se non esistessero.
Dopo molte sperimentazioni ho escogitato una soluzione un po 'hacker che funziona su varie piattaforme Android vecchie e nuove. Presenta alcuni piccoli inconvenienti estetici che sono difficili da notare. Mi piacerebbe comunque sentire una soluzione più ufficiale, diversa da "non farlo con uno spinner".
Questo nasconde sempre il primo elemento nello spinner, ma potrebbe essere facilmente esteso per nascondere un elemento arbitrario o più di un elemento. Aggiungi un elemento fittizio contenente una stringa vuota all'inizio dell'elenco di elementi di selezione. Potresti voler impostare la selezione attuale dello spinner sull'elemento 0 prima che la finestra di dialogo dello spinner si apra, questo simulerà uno spinner non selezionato.
Esempio di configurazione Spinner con override del metodo ArrayAdapter:
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);
linea non sia necessaria. Commentarlo non sembra fare alcuna differenza (visiva), almeno su Android 4.4.2 / KitKit (su un LG / Google Nexus 4).
setTag(1)
sul textView alla posizione 0, quindi l'ho usato convertView.getTag() != null
per determinare se la vista riutilizzata era la vista di altezza 0 creata per la posizione 0 o una vista normale usata per altri elementi di selezione. Questo era così che potevo usare a super.getDropDownView(position, convertView, parent)
volte invece di creare sempre una nuova vista.