Android:在ListView中使用之前修改Content Provider中的数据

时间:2011-03-03 21:21:58

标签: android listview cursor adapter

我使用ListView查询Android中的 ContactsContract.Data 表来显示数据。

有没有办法在显示之前修改从Content Provider返回的数据?

这是一个具体的例子:

我可以查询 ContactsContract.Data 以获取 STARRED 列,该列将返回“0”或“1”,但我希望改为的情况如何将'0'转换为'not starred',将'1'转换为'starred'

这是我现有的代码:

 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列的值插入到我的视图中我想首先对列值进行一些条件编辑。

有什么建议吗?

非常感谢, 史蒂夫

2 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分: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;
  }
});