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 utilisersuper.getDropDownView(position, convertView, parent)
parfois au lieu de créer toujours une nouvelle vue.Réponses:
Pour masquer un élément arbitraire ou plusieurs éléments, je pense que vous pouvez implémenter votre propre adaptateur et définir l'index (ou la liste des index du tableau) que vous souhaitez masquer.
Et utilisez votre adaptateur personnalisé lorsque vous créez la liste des éléments.
(Je n'ai pas testé le code) j'espère que cela aide.
la source
Il est plus facile de masquer un élément à la fin de la liste en tronquant la liste.
Mais vous devez d'abord le sélectionner pour qu'il apparaisse dans la double flèche, puis vérifier si la sélection a été remplacée par l'un des éléments affichés.
la source
Pour masquer un élément dans la liste déroulante de la flèche, vous devez transmettre la position de l'élément qui doit être masqué en fonction des critères requis. J'ai réalisé cela dans un cas d'utilisation consistant à masquer l'élément sélectionné dans la liste déroulante
Et régler l'adaptateur est quelque chose comme ça
En sélectionnant certains éléments dans la liste déroulante, la position doit également être modifiée
la source
Juste pour l'intérêt, j'ai fait une solution pour utiliser "Prompt" comme indice. Ce code est fait pour
Xamarin.Android
, mais il pourrait être parfaitement porté vers Java en 10 minutes. Utilisez-le comme un simpleArrayAdapter
sans ajouter d'éléments indexés à 0 ou à nombre d'index au tableau source. Il est également misSpinnerGeolocation.SelectedItemId
à -1 lorsque rien n'est choisi (hint
est l'élément actuel).la source
J'ai trouvé cette solution qui a résolu mon problème.
la source
Je pense qu'il vaudra mieux mettre la validation sur la liste des tableaux plutôt que sur Spinner car une fois l'élément filtré, il sera sûr de l'ajouter dans Spinner
la source
Une autre approche qui a fonctionné le mieux pour moi est de renvoyer un nouvel objet de vue vide. Il s'agit d'une approche très claire car vous ne jouez pas avec des éléments de tableau.
Créez votre classe d'adaptateur en étendant
ArrayAdapter
à l'intérieur de votre méthode
la source
C'est une question très ancienne, mais j'ai trouvé un moyen agréable (et probablement) propre de ne pas afficher les premiers éléments également. Inspiré par la réponse de @ Romich, j'ai ajouté une logique similaire pour ignorer le (s) premier (s) élément (s).
Cela masque effectivement un nombre arbitraire d'éléments (1 par défaut). Le code signale seulement que la taille des objets à rendre est plus courte qu'elle ne l'est réellement et modifie également l'index des éléments à rendre afin que nous sautions un nombre arbitraire d'éléments.
Pour simplifier les choses, j'ai exclu la solution que j'utilise actuellement, qui prend en charge le masquage de la liste d'éléments aléatoires, mais qui peut facilement être gérée par quelques modifications du code.
la source