我正在使用Filter with ListView,它通过包含姓名和号码的联系人数据填充。
现在,当我在EditText
中键入文本时,我遇到两个问题,而adapter.getFilter().filter(s.toString())
依次触发runQueryOnBackgroundThread
1)当我输入“aa”后者(在我的代码中)
我可以看到名字从'aa'开始,例如aakruti,但是在 同时我也能查看电子邮件地址,这是我不想要的 在过滤器被触发时使其可见。
2)当我输入'aa'后者(在手机的内置联系人列表中)
我可以看到名字从'aa'开始,例如aakruti
但是我缺少一个名字,即S A T Y A(通过联系方式显示) 当我在后面键入'aa'时搜索
这是我在StringBuilder buffer = null;
String[] args = null;
if (constraint != null) {
buffer = new StringBuilder();
buffer.append("UPPER(");
buffer.append(ContactsContract.Contacts.DISPLAY_NAME);
buffer.append(") GLOB ?");
args = new String[] { constraint.toString().toUpperCase() + "*" };
}
String sortOrder = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC";
System.out.println(buffer);
return mContent.query(
ContactsContract.Contacts.CONTENT_URI,
projection,
buffer == null ? null : buffer.toString(),
args,sortOrder
);
public static String[] projection = new String[] {
ContactsContract.Contacts._ID,
ContactsContract.Contacts.DISPLAY_NAME
};
投影数据
ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME
ContactsContract.CommonDataKinds.StructuredName.MIDDLE_NAME
ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME
ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME
修改
到目前为止,我试图访问
email address
但GIVEN_NAME也显示了少量contact name which has email address
,甚至显示xyz@gmail.com
Raul Jakson (which only has email address no contact number)
Raul Jakson ( i see this name twice as it has two different email address , but i wanna see it as name )
例如,
{{1}}
所以有人可以告诉我如何限制电子邮件地址并只显示只有联系电话号码的NAMES?
答案 0 :(得分:2)
首先,电子邮件显示,因为该联系人没有名称。在这些情况下,Android将使用电子邮件作为显示名称。要避免显示这些内容,请使用GIVEN_NAME和FAMILY_NAME。请参阅api docs for StructuredName。
其次,您没有找到SATIYA,因为您的查询正在寻找以AA开头的DISPLAY_NAME。 SATIYA不是一个单词,它是一系列首字母,例如S A T I Y A.如果你想找到这些,那么你必须制定你的查询来满足这一要求。你可以搜索* A * A *,但你可能会得到许多其他命中。我怀疑Android正在做一些初始+姓氏搜索的变种,其中 BO 会找到Barack Obama。