Je recherche un moyen de masquer un élément dans un widget spinner Android. Cela vous permettrait de simuler un spinner sans élément sélectionné et garantit que le rappel onItemSelected () est toujours appelé pour chaque élément sélectionné (si l'élément masqué est l'élément "actuel"). Normalement, il y a toujours un élément dans le spinner qui ne génère pas de rappel, à savoir celui en cours.
Il existe du code sur stackoverflow pour savoir comment désactiver (grisé) les éléments, mais pas comment masquer complètement les éléments comme s'ils n'existaient pas.
Après de nombreuses expérimentations, j'ai trouvé une solution quelque peu piratée qui fonctionne sur diverses anciennes et nouvelles plates-formes Android. Il présente quelques inconvénients cosmétiques mineurs difficiles à remarquer. J'aimerais toujours entendre parler d'une solution plus officielle, autre que "ne faites pas ça avec un spinner".
Cela masque toujours le premier élément dans le spinner, mais pourrait assez facilement être étendu pour masquer un élément arbitraire ou plus d'un élément. Ajoutez un élément factice contenant une chaîne vide au début de votre liste d'éléments spinner. Vous souhaiterez peut-être définir la sélection actuelle de la double flèche sur l'élément 0 avant que la boîte de dialogue de la double flèche ne s'ouvre, cela simulera une double flèche non sélectionnée.
Exemple de configuration de Spinner avec remplacement de méthode 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);
ligne est inutile. Le commenter ne semble pas faire de différence (visuelle), du moins sur Android 4.4.2 / KitKit (sur un LG / Google Nexus 4).
setTag(1)
sur le textView à la position 0, puis utilisé convertView.getTag() != null
pour déterminer si la vue réutilisée était la vue de hauteur 0 créée pour la position 0 ou une vue normale utilisée pour d'autres éléments de spinner. C'était si je pouvais utiliser super.getDropDownView(position, convertView, parent)
parfois au lieu de créer toujours une nouvelle vue.