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

问题描述 投票:1回答:1

在我的申请中,我正在寻求显示的联系方式

ContactsContract.CommonDataKinds.Organization.TITLE

在ContactsContract中,MIMETYPE用于从电话中选择大多数有用数据的列的标识。

我想在列表视图中显示联系人的职位。我已使用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
                );
android mime-types android-cursoradapter contactscontract android-cursorloader
1个回答
1
投票

您现在正在做的是基本上显示Contacts DB上所有职位的列表,并获取每个职位的联系人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);
}
© www.soinside.com 2019 - 2024. All rights reserved.