22

Attualmente sto costruendo la mia prima app per Android. Quello che sto avendo problemi è la memorizzazione e la visualizzazione localizzata delle date in connessione con uno SimpleCursorAdapter. Ho una classe che incapsula l'accesso a un SQLitedatabase con tre tabelle. Questa classe si occupa di memorizzare tutte le date in formato ISO ("aaaa-MM-gg"). Quando i valori della data vengono letti dal database e visualizzati sullo schermo, voglio che siano formattati in un formato localizzato. Ecco l'approccio che ho trovato. Esso utilizza una ViewBinder di fare la formattazione:Visualizzazione delle date in formato localizzato su 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() crea un oggetto SimpleDateFormat con un modello che viene letta da strings.xml. parseDatabaseDate() esegue l'analisi della data dal database con un che viene creato utilizzando un modello costante yyyy-MM-dd.

Anche se questo codice funziona bene, mi chiedo se c'è un modo migliore per farlo. Quello che non mi piace è che ho bisogno:

  • due SimpleDateFormat oggetti (uno è usato in parseDatabaseDate() al fine di analizzare la stringa data dal SQLiteDatabase, l'altro è usato per formattare il valore)
  • un java.util.Date oggetto che viene creato e poi gettato immediatamente
  • un bel po '(a mio avviso) codice boilerplate.

Ecco perché sto chiedendo: c'è un modo migliore per visualizzare le date in formato localizzato?

risposta

43

Se si desidera saltare l'analisi, è possibile memorizzare invece la data come lunga. Quindi potresti semplicemente creare un nuovo oggetto Date usando il long con parsing zero.

Questo non è direttamente correlato alla tua domanda, ma: Una cosa che si potrebbe desiderare di considerare l'utilizzo è android.text.format.DateFormat per ottenere la data di formattatori. In questo modo si formattano le date/orari per le impostazioni locali dell'utente invece dei propri preset. Potrebbe anche semplificare il codice, poiché non è più necessario creare il proprio SimpleDateFormat.

Con queste due cose in mente, si può sbarazzarsi delle chiamate per i propri metodi:

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

Daniele, grazie per questo. Devo ancora familiarizzare con le classi di Google che sostituiscono le comuni classi Java, come android.text.format.DateFormat. Anche l'uso dei long per lo storage è un'ottima idea. Che dovrebbe funzionare per questa applicazione specifica, che sicuramente non ha bisogno di memorizzare le date prima del 1970. –

+1

Il codice dato da Daniel è teoricamente corretto, ma devo fare alcune modifiche, invece, e renderlo essere questo: ((TextView) Vista) .setText (android.text.format.DateFormat.getDateFormat (Class.this) .format (new Date (cursor.getLong (columnIndex)))); – okysabeni

Problemi correlati