22

Je suis actuellement en train de construire ma première application pour Android. Ce qui me pose problème, c'est le stockage et l'affichage localisé des dates en relation avec un SimpleCursorAdapter. J'ai une classe qui encapsule l'accès à un SQLitedatabase avec trois tables. Cette classe prend soin de stocker toutes les dates au format ISO ("aaaa-MM-jj"). Lorsque les valeurs de date sont lues dans la base de données et affichées à l'écran, je souhaite qu'elles soient formatées dans un format localisé. Voici l'approche que j'ai trouvée. Il utilise un ViewBinder pour faire la mise en forme:Afficher les dates au format localisé sur Android

adapter.setViewBinder(new SimpleCursorAdapter.ViewBinder() { 
    @Override 
    public boolean setViewValue(View view, Cursor cursor, 
      int columnIndex) { 
     if (view.getId() == R.id.text1) { 
      ((TextView) view).setText(getDateFormatView().format(
       parseDatabaseDate(cursor.getString(columnIndex)))); 
      return true; 
     } else if (view.getId() == R.id.text2) { 
      ((TextView)view).setText(
       cursor.getString(columnIndex)); 
      return true; 
     } else { 
      return false; 
     } 
    } 
}); 

getDateFormatView() crée un objet SimpleDateFormat avec un motif qui est lu à partir strings.xml. parseDatabaseDate() effectue l'analyse de la date à partir de la base de données avec un SimpleDateFormat qui est construit en utilisant un modèle constant yyyy-MM-dd.

Bien que ce code fonctionne très bien, je me demande s'il existe une meilleure façon de le faire. Ce que je n'aime pas que j'ai besoin:

  • deux objets SimpleDateFormat (un est utilisé dans parseDatabaseDate() afin d'analyser la chaîne de date du SQLiteDatabase, l'autre est utilisée pour mettre en forme la valeur)
  • une java.util.Date objet qui est créé puis jeté immédiatement
  • beaucoup (à mon avis) code passe-partout.

Voilà pourquoi je demande: existe-t-il un meilleur moyen d'afficher les dates au format localisé?

Répondre

43

Si vous voulez ignorer l'analyse, vous pouvez stocker la date comme longue à la place. Ensuite, vous pouvez simplement créer un nouvel objet Date en utilisant l'analyse longue avec zéro.

Ce n'est pas directement lié à votre question, mais: Une chose que vous pourriez envisager d'utiliser est android.text.format.DateFormat pour obtenir vos formateurs de date. De cette façon, vous formatez vos dates et heures aux paramètres régionaux de l'utilisateur au lieu de vos propres paramètres prédéfinis. Cela pourrait aussi rendre votre code plus simple, car vous n'avez plus besoin de créer votre propre SimpleDateFormat.

Avec ces deux choses à l'esprit, vous pouvez vous débarrasser des appels à vos propres méthodes:

((TextView) view).setText(android.text.format.DateFormat.getDateFormat().format(new Date(cursor.getString(columnIndex)))); 
+0

Daniel, merci pour cela. Je dois encore me familiariser avec les classes de Google qui remplacent les classes Java courantes, comme android.text.format.DateFormat. L'utilisation de longs pour le stockage est également une bonne idée. Cela devrait fonctionner pour cette application spécifique qui n'a certainement pas besoin de stocker des dates avant 1970. –

+1

Le code donné par Daniel est théoriquement correct mais je dois faire quelques ajustements à la place et faire en sorte que: (vue (TextView)) .setText (android.text.format.DateFormat.getDateFormat (Class.this) .format (nouvelle date (cursor.getLong (columnIndex)))); – okysabeni

Questions connexes