22

В настоящее время я создаю свое первое приложение для Android. У меня возникают проблемы с хранением и локализованным отображением дат в связи с SimpleCursorAdapter. У меня есть класс, который инкапсулирует доступ к SQLitedatabase с тремя таблицами. Этот класс заботится о сохранении всех дат в формате ISO («yyyy-MM-dd»). Когда значения даты считываются из базы данных и отображаются на экране, я хочу, чтобы они были отформатированы в локализованном формате. Вот такой подход, который я придумал. Он использует ViewBinder сделать форматирование:Отображение дат в локализованном формате на 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() создает SimpleDateFormat объект с рисунком, который считывается из strings.xml. parseDatabaseDate() анализирует дату из базы данных с помощью SimpleDateFormat, которая построена с использованием постоянного шаблона yyyy-MM-dd.

Хотя этот код работает отлично, мне интересно, есть ли лучший способ сделать это. Что мне не нравится то, что мне нужно:

  • два SimpleDateFormat объекты (один используется в parseDatabaseDate() для того, чтобы разобрать строку даты из SQLiteDatabase, другие используются для форматирования значения)
  • в java.util.Date объект, который создается, затем сразу же отбрасывается
  • довольно много (на мой взгляд) шаблонного кода.

Так вот почему я спрашиваю: есть ли лучший способ отображать даты в локализованном формате?

ответ

43

Если вы хотите пропустить синтаксический анализ, вы можете сохранить дату как долгое время. Затем вы можете просто создать новый объект Date, используя длинный с нулевым разбором.

Это не имеет прямого отношения к вашему вопросу, но: Одна вещь, которую вы, возможно, захотите рассмотреть, - это android.text.format.DateFormat для получения вашей даты. Таким образом вы отформатируете свои даты/время к языковым настройкам пользователя вместо своих собственных пресетов. Это может также сделать ваш код более простым, так как вам больше не нужно создавать свой собственный SimpleDateFormat.

С этими двумя вещами в виду, вы можете избавиться от звонков вашим собственным методам:

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

Даниил, спасибо за это. Мне еще нужно ознакомиться с классами Google, которые заменяют обычные классы Java, такие как android.text.format.DateFormat. Хорошая идея - использование longs для хранения. Это должно работать для этого конкретного приложения, которое, безусловно, не должно хранить даты до 1970 года. –

+1

Код, данный Даниэлем, является теоретически правильным, но я должен внести некоторые корректировки и сделать так: ((TextView) view) .setText (android.text.format.DateFormat.getDateFormat (Class.this) .format (новая дата (cursor.getLong (columnIndex)))); – okysabeni

Смежные вопросы