Изменение значений из курсора с помощью SimpleCursorAdapter
У меня есть таблица базы данных со столбцами {Имя, время (формат UTC), широта, долгота}
Я показываю таблицу, используя ListActivity с SimpleCursorAdapter.
Мне хотелось бы, чтобы столбец Time показывал время в человекообразном формате (13-07-2010 10:40), а не в формате UTC (18190109089).
Как я могу указать, что значения из столбца Time нуждаются в некоторой фильтрации/адаптации?
ВОЗМОЖНОЕ РЕШЕНИЕ (с проблемой):
SimpleCursorAdapter предлагает метод:
setCursorToStringConverter(SimpleCursorAdapter.CursorToStringConverter cursorToStringConverter);
чтобы указать, как класс, способный преобразовать курсор в CharSequence (convertToString (курсор).
Во всяком случае, я не знаю, в каком формате должен быть возвращаемый параметр CharSequence!
Ответы
Ответ 1
Самый простой способ форматирования значения курсора - использовать SimpleCursorAdapter.setViewBinder(..):
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.list, cursor,
new String[] { Definition.Item.TITLE, Definition.Item.CREATE_DATE }, new int[] { R.id.title, R.id.createDate});
adapter.setViewBinder(new ViewBinder() {
public boolean setViewValue(View aView, Cursor aCursor, int aColumnIndex) {
if (aColumnIndex == 2) {
String createDate = aCursor.getString(aColumnIndex);
TextView textView = (TextView) aView;
textView.setText("Create date: " + MyFormatterHelper.formatDate(getApplicationContext(), createDate));
return true;
}
return false;
}
});
Ответ 2
У меня также была такая же проблема после долгой борьбы, наконец, я нашел ответ:) (см. ниже)
use setViewText (TextView v, String text)
например
SimpleCursorAdapter shows = new SimpleCursorAdapter(this, R.layout.somelayout, accountCursor, from, to)
{
@Override
public void setViewText(TextView v, String text) {
super.setViewText(v, convText(v, text));
}
};
private String convText(TextView v, String text)
{
switch (v.getId())
{
case R.id.date:
String formatedText = text;
//do format
return formatedText;
}
return text;
}
Ответ 3
Вы можете использовать setViewBinder()
или подкласс SimpleCursorAdapter
и переопределить bindView()
.
Ответ 4
Вы можете использовать SQLite синтаксис этого столбца для форматирования даты.
Что-то вроде этого сделает это
SELECT strftime('%d-%m-%Y %H:%M',1092941466,'unixepoch');
SELECT strftime('%d-%m-%Y %H:%M',timecol,'unixepoch');
Ответ 5
Пройдя через это старое сообщение, я заметил, что сделал что-то похожее, которое могло бы помочь:
public class FormatCursorAdapter extends SimpleCursorAdapter {
protected int[] mFormats;
public static final int FORMAT_TEXT=0;
public static final int FORMAT_CURRENCY=1;
public static final int FORMAT_DATE=2;
public FormatCursorAdapter(Context context, int layout, Cursor c, String[] from, int[] to, int[] formats, int flags) {
super(context, layout, c, from, to, flags);
mFormats = formats;
ViewBinder viewBinder = new ViewBinder() {
@Override
public boolean setViewValue(View view, Cursor cursor, int columnIndex) {
int formatType = mFormats[columnIndex-1];
switch (formatType) {
case FORMAT_CURRENCY:
NumberFormat nf = NumberFormat.getCurrencyInstance();
nf.setMaximumFractionDigits(2);
((TextView)view).setText(nf.format(cursor.getDouble(columnIndex)));
return true;
case FORMAT_DATE:
DateFormat df = SimpleDateFormat.getDateTimeInstance();
((TextView)view).setText(df.format(new Date(cursor.getLong(columnIndex))));
return true;
}
return false;
}
};
setViewBinder(viewBinder);
}
}
Использование:
// For the cursor adapter, specify which columns go into which views with which format
String[] fromColumns = {
Table.COLUMN_TITLE,
Table.COLUMN_AMOUNT,
Table.COLUMN_DATE};
int[] toViews = {
R.id.tvTitle,
R.id.tvAmount,
R.id.tvDate};
int[] formatViews = {
FormatCursorAdapter.FORMAT_TEXT,
FormatCursorAdapter.FORMAT_CURRENCY,
FormatCursorAdapter.FORMAT_DATE};
mAdapter=new FormatCursorAdapter(getContext(),R.layout.item_operation,cursor,
fromOpsColumns,toOpsViews,formatViews,0);
mListView.setAdapter(mOpsAdapter);
Надеюсь, это поможет кому угодно!