gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 00:05:43 24 4
gpt4 key购买 nike

在我的应用程序中,我想显示

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

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

我想在我的 ListView 中显示联系人的职务。我已将 IN 的 SQL 注入(inject)用于 WHERE/SELECTION 子句,代码如下。

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

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

如上所述,我正在寻找如何在我的 CursorLoader 或我的 CursorAdapter 中设置光标的 MIMETYPE。

绑定(bind)适配器方法如下所示

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
);

最佳答案

您现在所做的基本上是在联系人数据库中显示所有职位的列表,并获取每个职位的联系人 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);
}

关于android - 在 Adapter 或 Fragment 中为 ContactsContract 设置数据的 MIMETYPE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49062713/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com