Изменение значений из курсора с помощью SimpleCursorAdapter - PullRequest
27 голосов
/ 31 августа 2010

У меня есть таблица базы данных со столбцами {Имя, Время (формат UTC), Широта, Долгота}

Я отображаю таблицу, используя ListActivity с SimpleCursorAdapter.

Мне бы хотелось, чтобыстолбец Time показывает время в удобочитаемом формате (13-07-2010 10:40), а не в формате UTC (18190109089).

Как указать, что значения из столбца Time требуют некоторой фильтрации /Адаптация?

ВОЗМОЖНОЕ РЕШЕНИЕ (с проблемой):

SimpleCursorAdapter предлагает метод:

setCursorToStringConverter(SimpleCursorAdapter.CursorToStringConverter cursorToStringConverter);

, чтобы указать, как класс, который может конвертировать Cursor в CharSequence(convertToString (курсор курсора). В любом случае, я не знаю, в каком формате должен быть возвращаемый параметр CharSequence!

Ответы [ 5 ]

74 голосов
/ 23 января 2011

Самый простой способ отформатировать значение курсора - использовать 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;
    }
});
13 голосов
/ 04 января 2011

у меня тоже была такая же проблема после долгой борьбы, наконец я нашел ответ :) (см. Ниже)

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;
}
4 голосов
/ 31 августа 2010

Вы можете использовать синтаксис SQLite в этом столбце для форматирования даты.

Что-то подобное сделает это

SELECT strftime('%d-%m-%Y %H:%M',1092941466,'unixepoch');

SELECT strftime('%d-%m-%Y %H:%M',timecol,'unixepoch');
4 голосов
/ 31 августа 2010

Вы можете использовать setViewBinder() или подкласс SimpleCursorAdapter и переопределить bindView().

0 голосов
/ 01 сентября 2017

Проходя по этому старому посту, заметил, что я сделал нечто подобное, что может помочь:

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);

Надеюсь, это кому-нибудь поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...