2011-03-03 27 views
2

我正在查詢ContactsContract.Data Android中的表使用ListView來顯示數據。Android:在ContentView Provider中修改數據,然後在ListView中使用

有沒有辦法在內容提供者顯示之前修改從內容提供者返回的數據?

這裏是一個具體的例子:

我可以查詢ContactsContract.Data加星列,這將返回一個「0」或「1」,但這個案子什麼,我想而不是轉換「0」到「不出演」和「1」到「出演」

這裏是我現有的代碼:

private void populateList() { 
// Start with the cursor 
    Cursor cursor = getContacts(); 
    // Then the adapter 
    String[] fields = new String [] { 
      ContactsContract.Data.DISPLAY_NAME, 
      ContactsContract.Data.CONTACT_STATUS, 
        // WOULD LIKE THIS FIELD TO BE MODIFIED 
      ContactsContract.Data.STARRED 
    }; 
    SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, 
      R.layout.aa_list_activity_row_sjp, 
      //android.R.layout.simple_list_item_multiple_choice, 
      cursor, 
      fields, 
      new int [] { 
       R.id.rowText1, 
       R.id.rowText2, 
       R.id.rowText3 
       }); 
    // end with "setListAdapter" 
    setListAdapter(adapter); 
} 

private Cursor getContacts() { 
    // Setup the query and return a cursor 
    Uri uri = ContactsContract.Contacts.CONTENT_URI; 
    String [] projection = new String [] { 
     ContactsContract.Contacts._ID, 
     ContactsContract.Contacts.DISPLAY_NAME, 
     ContactsContract.Contacts.CONTACT_STATUS, 
     ContactsContract.Contacts.STARRED 
    }; 
    String selection = ContactsContract.Contacts.IN_VISIBLE_GROUP + " = '1'"; 
    String [] selectionArgs = null; 
    String sortOrder = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC"; 

    return managedQuery(uri, projection, selection, selectionArgs, sortOrder); 
} 

我不知道是否有可能,而是比直接插入STARRED列的值到我的視圖我想先做一些條件編輯的列值。

有什麼建議嗎?

非常感謝你, 史蒂夫

回答

1

DJG啓發了我經過一番更多的研究,我發現這個解決方案提到in another thread

您可以設置一個自定義SimpleCursorAdapter.ViewBinder:

我喜歡這個解決方案,因爲如果你使用匿名實現,你不需要創建另一個類。

在我的特定情況下,我會插入調用之前實例我SimpleCursorAdapter,右setListAdapter(adapter);

新代碼後,下面的代碼塊:

adapter.setViewBinder(new SimpleCursorAdapter.ViewBinder() { 
    @Override 
    public boolean setViewValue(View view, Cursor cursor, int columnIndex) { 
    if (columnIndex == 3) { 
     ((TextView) view).setText(cursor.getString(columnIndex).equals("1") ? "starred" : "not starred"); 
     return true; 
    } 
    return false; 
    } 
});
1

你可以嘗試繼承SimpleCursorAdapter和實施方法

public void setViewText(TextView v, String text) { 
    if (v.getId() == R.id.rowText3) { 
     text = "0".equals(text) ? "not starred" : "starred"; 
    } 
    v.setText(text); 
} 
+0

真棒,這樣的偉大工程,我敲我的現在頭撞牆。此外,它重新調整搜索範圍,讓我發現SimpleCursorAdapter.ViewBinder - 如果我有rep,我會投票贊成:) – 2011-03-04 03:19:13

相關問題