具有名称和电子邮件的Android自定义联系人ListView

时间:2019-04-04 18:34:12

标签: android android-contacts simplecursoradapter

我想为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

我意识到从联系人到电子邮件的映射是一对多的。那是我的问题吗?我可以投射“主要”电子邮件地址吗?

1 个答案:

答案 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列。