我想为Android中的联系人建立自定义的信息列表视图。
Android文档布局在这里是一个非常简单的示例: https://developer.android.com/training/contacts-provider/retrieve-names#Permissions
它从您的联系人中获取显示名称,并将其显示在列表视图中。给CursorLoader的投影为:
private val PROJECTION: Array<out String> = arrayOf(
ContactsContract.Contacts._ID,
ContactsContract.Contacts.LOOKUP_KEY,
ContactsContract.Contacts.DISPLAY_NAME
)
然后映射到简单光标:
private val FROM_COLUMNS: Array<String> = arrayOf(
ContactsContract.Contacts.DISPLAY_NAME
)
我还要在列表视图中添加一个电子邮件地址。文档使用的SimpleCursorAdapter是否可能?
我也尝试更改投射方式以投射电子邮件地址:
private val PROJECTION: Array<out String> = arrayOf(
ContactsContract.Contacts._ID,
ContactsContract.Contacts.LOOKUP_KEY,
ContactsContract.Contacts.DISPLAY_NAME,
ContactsContract.CommonDataKinds.Email.DISPLAY_NAME
)
但是,当我这样做时,我会得到一个例外:
java.lang.IllegalArgumentException:无效的列数据4
我意识到从联系人到电子邮件的映射是一对多的。那是我的问题吗?我可以投射“主要”电子邮件地址吗?
答案 0 :(得分:0)
我不知道drop
是否可以做到这一点,因为我不使用它,所以让我告诉您如何通过简单的查询来加载电子邮件地址。
我使用以下方法同时加载电子邮件和电话号码,因此代码可能不是最佳选择。
首先,电子邮件地址存储在通用SimpleCursorAdapter
数据列中,但是同一列也可以用于其他数据类型(例如电话号码)。这就是为什么我使用以下投影:
ContactsContract.Data.DATA1
然后我像下面一样查询它并逐一处理数据,每次检查private val PROJECTION =
arrayOf(
ContactsContract.Data.CONTACT_ID,
ContactsContract.Data.DISPLAY_NAME_PRIMARY,
ContactsContract.Data.DATA1,
ContactsContract.Data.MIMETYPE
)
MIME类型:
data1
我敢肯定,也许会有更好的方法。
更新#1
此处有一些文档:
更新#2
正如您在文档或代码中所看到的,contentResolver.query(
ContactsContract.Data.CONTENT_URI,
PROJECTION,
null,
null,
null
)?.use { cursor ->
val idxId = cursor.getColumnIndex(ContactsContract.Data.CONTACT_ID)
val idxDisplayNamePrimary = cursor.getColumnIndex(ContactsContract.Data.DISPLAY_NAME_PRIMARY)
val idxData1 = cursor.getColumnIndex(ContactsContract.Data.DATA1)
val idxMimeType = cursor.getColumnIndex(ContactsContract.Data.MIMETYPE)
while (cursor.moveToNext()) {
val id = cursor.getLong(idxId)
val name: String? = cursor.getString(idxDisplayNamePrimary)
val data1: String? = cursor.getString(idxData1)
val mimeType: String? = cursor.getString(idxMimeType)
if (mimeType == ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE) {
// e-mail was found and loaded into data1 - do something with it here
}
}
}
指向ContactsContract.CommonDataKinds.Email.ADDRESS
列。