2011-07-23 55 views
0

我有一個ListAdapter,它從我的SQLite數據庫中獲取日期並將它們全部顯示在列表中。事情是,日期不是人類可讀的格式,並且我有一個幫助器方法來執行轉換,但是如何在我的代碼中實現它?在ListAdapter上顯示之前格式化數據

這是我的代碼看起來像:

// 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); 
+0

不是一個答案,但對於改善性能,我認爲在將數據保存到數據庫時轉換時間格式更好,而不是每次從數據庫加載數據時進行轉換。 – NguyenDat

+0

不是一個好主意,因爲我不想將日期保存爲數據庫中的「2011年7月27日」,但我希望像「20110727」(YYYYMMDD)這樣的東西能夠輕鬆地進行比較以及使用其他格式。 – Assim

回答

0

使用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

我在哪裏準確地放置該代碼?我嘗試將它放在SimpleCursorAdapter之後,但是在最後一行dataBinder不是setCursorToString的正確參數時出現了一些錯誤。 – Assim

+0

@Assim我更新了代碼。 – dira

+0

它仍然不起作用,我不知道把它放在我的代碼中的位置,我還必須改變我的原始代碼中的東西嗎?它仍然是與最後一行中的參數有關,我不能似乎使它工作。 – Assim

0

選項1:像@nguyendat說,對於性能,你可以存儲在數據庫中的格式化的日期,以及未格式化的版本,給你最大的靈活性。如果在同一個表中,由於冗餘性,這將違反第二範式,並且在代碼中必須小心以更新該行中的所有數據。 要實現這一點,請將轉換代碼放入DBAdapter中的insert命令中。

選項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; 
    } 

這將返回FormattedDate的ArrayList對象

最後,這將填充一個ListView

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); 
相關問題