我使用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列的值插入到我的视图中我想首先对列值进行一些条件编辑。
有什么建议吗?
非常感谢, 史蒂夫
答案 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;
}
});