Je cherche un moyen de masquer un élément dans un widget spinner Android. Cela permettrait de simuler un spinner sans éléments sélectionnés, et de s'assurer que le callback onItemSelected() est toujours appelé pour chaque élément sélectionné (si l'élément caché est l'élément "courant"). Normalement, il y a toujours un élément dans le spinner qui ne génère pas de callback, à savoir l'élément courant.
Il y a un peu de code sur stackoverflow pour savoir comment désactiver (griser) des éléments, mais pas comment cacher complètement des éléments comme s'ils n'existaient pas.
Après de nombreuses expérimentations, j'ai trouvé une solution un peu bricolée qui fonctionne sur diverses plateformes Android, anciennes et nouvelles. Elle présente quelques inconvénients cosmétiques mineurs qui sont difficiles à remarquer. J'aimerais quand même entendre parler d'une solution plus officielle, autre que "ne faites pas ça avec un spinner".
Cela cache toujours le premier élément du spinner, mais pourrait assez facilement être étendu pour cacher un élément arbitraire ou plus d'un élément. Ajoutez un élément fictif contenant une chaîne vide au début de votre liste d'éléments du compteur rotatif. Vous pouvez définir la sélection actuelle du compteur à l'élément 0 avant l'ouverture de la boîte de dialogue du compteur, ce qui simulera un compteur non sélectionné.
Exemple de configuration de Spinner avec une surcharge de la 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);
0 votes
Qu'avez-vous trouvé sur les autres sites Internet ? Qu'avez-vous essayé jusqu'à présent ?
0 votes
Désolé lah, je ne sais pas comment faire.
0 votes
Belle solution ! Mais je pense que le
tv.setVisibility(View.GONE);
est inutile. La commenter ne semble pas faire de différence (visuelle), du moins sous Android 4.4.2/KitKit (sur un LG/Google Nexus 4).0 votes
La réponse à cette question fonctionne bien .
0 votes
Ce n'est peut-être pas une amélioration, mais j'ai utilisé
setTag(1)
sur le textView à la position 0, puis a 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 les autres éléments du spinner. Ceci afin de pouvoir utilisersuper.getDropDownView(position, convertView, parent)
parfois au lieu de toujours créer une nouvelle vue.0 votes
Quelqu'un peut-il examiner mon pregunta ?
0 votes
Ça marche, c'est bien, juste ce que je cherchais.