Dans le tutorial précédent, on a vu comment récupérer la donnée (liste des pokémons) depuis une base SQLite et comment l’afficher dans un composant List:
AIR Mobile – Application Pokémon (5) – Liste des Pokémon depuis la BDD SQLite
Maintenant que l’on a les bases de notre application, on va ajouter une fonction de recherche. Vous l’avez remarqué, la liste des pokémons est longue, plus de 500 éléments. On a fait un « order » sur le nom dans notre requête pour qu’ils ne soient pas mélangés mais si vous cherchez « Salameche », vous allez scroller un moment.
Si vous vous souvenez de la maquette que l’on avait fait en début du projet, vous remarquerez que l’on a un champ texte en haut de la vue permettant de rechercher un Pokémon.
Ajout du composant TextInput
Un champ de saisie est un composant nommé « TextInput » en Flex. Celui-ci devra se trouver dans la partie du haut qui est nommée ActionBar. Une petite piqûre de rappel si vous n’avez pas suivi les tutoriaux précédents:
AIR Mobile – Comprendre les composants ViewNavigator et View
Regardez surtout à la fin, le schéma expliquant le découpage naturel de l’ActionBar en 3 parties:
Dans notre cas, on a pas affaire à des boutons de navigation ou d’action mais à un composant que l’on veut centrer. On va donc l’afficher dans la partie « titleContent« . Pour cela, ouvrez une balise XML (« < ») dans votre vue PokemonInfoHomeView.mxml et tapez « titlec » puis Entrée et fermez le tag XML pour que Flash Builder vous complète la balise fermante:
...
</fx:Declarations>
<s:titleContent>
</s:titleContent>
<s:List width="100%" height="100%" dataProvider="{_dp}" labelField="nom">
...
Insérez un tag TextInput dans cette balise. Au passage, donnez lui un id égal à « input » et une width de valeur « 100% ». Vous avez une nouvelle propriété sur les composants de saisie de texte en Flex 4.5 qui est la propriété « prompt ». Celle-ci sert à afficher une valeur lorsque le champ texte n’est pas sélectionné pour inviter l’utilisateur à taper. Donnez lui la valeur « Rechercher un Pokémon »:
<s:titleContent>
<s:TextInput id="input" width="100%" prompt="Rechercher un Pokémon" />
</s:titleContent>
Lancez le programme et voilà le résultat:
Ajout d’une méthode de filtrage « filterFunction »
Pour effectuer notre filtrage, nous avons plusieurs solutions. La plus évidente est de faire à chaque frappe, une nouvelle requête SQL avec une clause LIKE qui nous renvoie tous les pokémons dont le nom correspond. On ne va pas adopter cette solution car dans notre cas, on a déjà requête tous les éléments de la base, qui sont conservés dans une variable nommée « _dp » de type ArrayCollection. Notre filtrage étant plutôt simple, on va utiliser un mécanisme de filtrage présent sur la classe ArrayCollection.
ArrayCollection offre un mécanisme de filtrage paramétrable grâce à sa propriété « filterFunction« . Cette propriété va référencer comme son nom l’indique une « function » de votre code. Cette fonction a une signature bien particulière qui est la suivante (cf. docs):
function filterByName(item:Object):Boolean {
Elle prend un objet en entrée et renvoie un Boolean. En d’autre terme, on lui passe un élément de donnée et elle décide si cet élément doit être filtré ou non. Si la méthode renvoie « true » pour un élément, celui-ci fera partie de la liste, sinon celui-ci sera filtré.
On va tout d’abord récupérer la saisie de l’utilisateur. Celle-ci se trouve dans la propriété « text » de notre composant repéré par la propriété id= »input ». On va tout de suite faire un test d’échappement dans le cas où l’utilisateur n’a rien tapé:
private function filterByName(item:Object):Boolean {
var inputValue:String = input.text;
if (!inputValue || inputValue == "") {
return true;
}
}
Si aucune saisie, on renvoie « true » pour laisser passer tous les éléments.


