Форматировать данные перед отображением в ListAdapter - PullRequest
0 голосов
/ 23 июля 2011

У меня есть ListAdapter, который берет даты из моей базы данных SQLite и отображает их все в списке. Дело в том, что дата не в удобочитаемом формате, и у меня есть вспомогательный метод для выполнения преобразования, но как мне реализовать его в моем коде?

Вот так выглядит мой код:

    // Get all of the notes from the database and create the item list
    Cursor c = mDbHelper.fetchAllItems();
    startManagingCursor(c);

    String[] from = new String[] { TrackerDbAdapter.KEY_DATE };
    int[] to = new int[] { R.id.row_date };

    // Now create an array adapter and set it to display using our row
    SimpleCursorAdapter history =
        new SimpleCursorAdapter(this, R.layout.history_row, c, from, to);
    setListAdapter(history);

Ответы [ 3 ]

0 голосов
/ 23 июля 2011

Используйте SimpleCursorAdapter.ViewBinder, чтобы прикрепить отформатированные данные к представлениям.

SimpleCursorAdapter.ViewBinder dataBinder = new SimpleCursorAdapter.ViewBinder() {
@Override
    public boolean setViewValue(View view, Cursor cursor, int columnIndex) {
        ((TextView)view).setText(cursor.getString(columnIndex));
        return true;
    }
};
simpleCursorAdapter.setViewBinder(dataBinder)
0 голосов
/ 24 июля 2011

Вариант 1. Как сказал @nguyendat, для повышения производительности вы можете хранить отформатированную дату в базе данных, а также неформатированную версию, чтобы обеспечить максимальную гибкость.Однако, если в той же таблице это нарушит 2-ую нормальную форму из-за избыточности, и вы должны быть осторожны в своем коде, чтобы обновить все данные в строке.Чтобы реализовать это, поместите код конвертации в DBAdapter в команде вставки.

Вариант 2. Создайте класс для вашей даты

public class FormattedDate {
private int oneDate;
public Punch (int unformattedDate) {
    oneDate = unformattedDate;
}  // ends constructor

@Override
public String toString() {
    //put your conversion code here
    return myFormattedDate;
}}

Это дает дополнительное преимущество в правильном местепоместить любой другой код для сравнения или преобразования.

Внутри вашего DBAdapter измените ваш запрос на этот

public ArrayList<FormattedDate> fetchAllItems() {   
    ArrayList<FormattedDate> results = new ArrayList<FormattedDate>();
    Cursor c = db.rawQuery("SELECT MY_UNFORMATTED_DATE FROM yourTable", null);
    if (c.getCount() > 0) {
        c.moveToFirst();
        do {
            results.add( new FormattedDate(c.getInt(c.getColumnIndex(MY_UNFORMATTED_DATE))));
            } while (c.moveToNext());
        }
        c.close();
        return results;
    }

Это возвращает ArrayList объектов FormattedDate

Наконец, этобудет заполнять список

setContentView(R.layout.my_list_view);
ArrayList<FormattedDate> dateArray = mDBHelper.fetchAllItens();
ArrayAdapter<FormattedDate> dateAdapter = new ArrayAdapter<FormattedDate> (getApplicationContext(), R.layout.list_item, dateArray);
setListAdapter(dateAdapter);
0 голосов
/ 23 июля 2011

Я бы попробовал создать собственный ListAdapter или собственный SimpleCursorAdapter

Если вам не нужно использовать курсор, посмотрите на эту ссылку. http://www.softwarepassion.com/android-series-custom-listview-items-and-adapters/ Объясняется, как использовать arraylist и пользовательский listAdpater.

Вы также можете сделать то же самое с SimpleCursorAdapter. Я не смог найти хороший учебник в это время. Я добавлю к этому, когда я

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