Pour finir le projet ListViewJson, on va placer un bouton dans l'Action Bar, utiliser les SharedPreferences et utiliser la ListView de la ListActivity par rapport à la base de donnée SQLite.
Pour finir l'application, on va commencer par créer la fonction permettant de remplir la ListView de MainActivity.
SQLite vers ListView
Dans la MainActivity on va ajouter les deux fonctions nécessaires pour remplir la ListView.
MainActivity.java
recupContact :
- Tout d'abord on ouvre notre base de donnée.
- On appel la fonction getAllContacts de notre datasource
- On retourne la liste de Contact
refreshList :
- On récupère la liste de Contact avec la fonction précédente
- On l'insert dans l'ArrayAdapter
- On attribut l'ArrayAdapter à notre ListView (sera afficher ce que retourne la fonction toString de notre classe Contact.java)
Action Bar
A présent, on va ajouter un bouton rafraichir dans notre application.
/res/menu/main.xml
Pour ajouter un bouton au menu, différentes configurations sont possibles :
- On lui attribue un ID
- On donne un orde d'affichage
- On lui donne un icône
- showAsAction est assez intéressant car selon le paramètre, soit on affiche l'icone à coté du bouton paramètre (représenté par les trois points veticales) soit dedans et soit selon l'espace disponible. De plus, pour les anciennes versions d'Android (<=2.3.3), le bouton s'affichera lors de l'appui sur la touche physique menu (représenté par les trois traits l'un en dessous de l'autre)
- Et un texte
L'icône choisit est le suivant :
Et maintenant on s'occupe de l'action lors de l'appuie sur la touche rafraichir.
MainActivity.java
On modifie l'écouteur des touches de menu et à travers d'un switch, on appel la tâche asynchrone si l'appuie a été effectué sur le bon bouton.
SharedPreferences
On va utiliser une Préférence qui correspond à une variables que l'on stockera et qui sera conserver même à l'extinction de l'application. Cela va permettre de ne pas mettre à jour la liste à chaque démarrage, mais par exemple une fois par jour.
MainActivity.java
Pour cela on va modifier la fonction onCreate de MainActivity.
- On récupère la préférence nommée lastSync dans le Context et en mode privé.
- On récupère la valeur de la préférence (0 si n'existe pas). On enregistre dans cette préférence le timestamp (milliseconde depuis le 1er janvier 1970 à 0 h) de la dernière synchronisation.
- On soustraie le timestamp du moment du lancement de l'application et de la préférence. Si la différence est supérieur au nombre de milliseconde d'une journée (86400000) alors on réalise la synchronisation.
- Sinon on appelle la fonction qui charge les contacts depuis la base de donnée SQLite.
On modifie ainsi notre tâche asynchrone pour enregistrer la date de dernière synchronisation.
BackTask.java
On enregistre la date si l'enregistrement des contacts dans la BDD s'est bien passé.
- On récupère notre SharedPreferences lastSync en mode privé.
- On ouvre l'edition de la Préférence avec un Editor
- On place le timestamp de la synchronisation avec un putLong
- On enregistre avec un commit
On en profite aussi pour rafraichir la liste dans la fonction onPostExecute de notre tâche asynchrone.
Récapitulatif
Au final le fichier BackTask.java :