在Adapter或Fragment中为ContactsContract设置MIMETYPE数据

时间:2018-03-02 04:13:02

标签: android mime-types android-cursoradapter contactscontract android-cursorloader

在我的申请表中,我正在寻求显示

的联系方式
ContactsContract.CommonDataKinds.Organization.TITLE

在ContactsContract中,MIMETYPE用于从手机中选择大部分有用数据列的标识。

我正在寻找在listview中显示联系人的职位名称。我已经使用IN的SQL注入来获取WHERE / SELECTION子句,并使用下面的代码。

 private static final String SELECTION =
            ContactsContract.RawContactsEntity.MIMETYPE + " IN ('" +
            ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE + "')";

但这有效,因为它在where子句中删除了没有值的项目,这些项目在很大程度上减少了列表中项目的数量。

如上所述,我试图找到如何在我的CursorLoader或my CursorAdapter中设置光标的MIMETYPE。

绑定适配器方法如下所示

public void onBindViewHolder(ContactsViewHolder viewHolder, Cursor cursor) {
    String profession = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Organization.TITLE));
    String contactID = cursor.getString(cursor.getColumnIndex( ContactsContract.Data.CONTACT_ID));
    Uri contactURI = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI,
            Integer.parseInt(contactID));
    viewHolder.setProfession(profession);
    viewHolder.setURI(contactURI);

CursorLoader看起来像这样。 FROM_COLUMNS包含基本数据,包括

 ContactsContract.CommonDataKinds.Organization.TITLE


 return new CursorLoader(
                        getContext(),
                        ContactsContract.Data.CONTENT_URI,
                        FROM_COLUMNS,
                        null,
                        null,
                        null
                );

1 个答案:

答案 0 :(得分:1)

您现在正在做的事情基本上是在联系人数据库上显示所有职位名称的列表,并获取每个职位的联系人ID。

如果我理解正确,您要尝试实现的是在数据库上显示所有联系人列表,如果联系人包含职务名称,则显示下一个联系?

如果是这样,您无法在Data.CONTENT_URI上创建CursorLoader,因为它每个数据包含一个项目,即每个联系人可能包含许多数据行。

您可以完全避免使用CursorLoader,并遍历Data中的所有项目 - 将它们存储在某些HashMap的内存中,然后创建一个ListView / RecyclerView适配器以在屏幕上显示HashMap。

这里的代码可以帮助您入门(考虑创建一个自定义对象来包含联系人信息,而不是我在下面使用的字符串列表):

Map<Long, List<String>> contacts = new HashMap<Long, List<String>>();

String[] projection = {Data.CONTACT_ID, Data.DISPLAY_NAME, Data.MIMETYPE, Data.DATA1 };
// select only contacts that have at least one phone, email or job
String selection = Data.MIMETYPE + " IN ('" + Phone.CONTENT_ITEM_TYPE + "', '" + Email.CONTENT_ITEM_TYPE + "', '" + Organization.CONTENT_ITEM_TYPE + "')";
Cursor cur = cr.query(Data.CONTENT_URI, projection, selection, null, null);

while (cur != null && cur.moveToNext()) {
    long id = cur.getLong(0);
    String name = cur.getString(1);
    String mime = cur.getString(2); // type of data: email / phone / company
    String data = cur.getString(3); // the actual info, e.g. +1-212-555-1234

    switch (mime) {
        case Phone.CONTENT_ITEM_TYPE: 
            kind = "phone"; 
            break;
        case Email.CONTENT_ITEM_TYPE: 
            kind = "email";
            break;
        case Organization.CONTENT_ITEM_TYPE: 
            kind = "job";
            break;
    }

    Log.d(TAG, "got " + id + ", " + name + ", " + data);

    // add info to existing list if this contact-id was already found, or create a new list in case it's new
    List<String> infos;
    if (contacts.containsKey(id)) {
        infos = contacts.get(id);
    } else {
        infos = new ArrayList<String>();
        infos.add("name = " + name);
        contacts.put(id, infos);
    }
    infos.add(kind + "= " + data);
}