我目前正在使用ContentProvider作为联系人,以从设备中检索联系人,并允许用户通过键入EditText来过滤结果。

为此,我在SimpleAdapter上设置了过滤器查询,如下所示:

    contactsAdapter.setFilterQueryProvider(new FilterQueryProvider() {
        String[] PROJECTION = new String[] {
                ContactsContract.Contacts._ID,
                ContactsContract.Contacts.DISPLAY_NAME,
                ContactsContract.Contacts.HAS_PHONE_NUMBER,
        };
        String sortOrder = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED COLLATE NOCASE ASC";

          public Cursor runQuery(CharSequence constraint) {
            String SELECTION = "LOWER(" + ContactsContract.Contacts.DISPLAY_NAME + ")"
            + " LIKE '" + constraint + "%' " + "and " + ContactsContract.Contacts.IN_VISIBLE_GROUP + " = '1'";
            Cursor cur = managedQuery(ContactsContract.Contacts.CONTENT_URI,
                    PROJECTION, SELECTION, null, sortOrder);
            return cur;
          }
        });
    setListAdapter(contactsAdapter);


在大多数情况下,这是可行的,但是当我有重音符号时(例如:TéstCóntact),那么即使用户键入Test Contact,我也希望该音色显示出来,但目前没有。

同样,在这种情况下也不会忽略这种情况,而对于标准字符,例如,如果我有一个名为Omar的联系人并搜索omar,则匹配,但是如果我有一个名为Ómar的联系人并搜索ómar,则该键不匹配。

有谁知道我应该怎么做才能实现我想要实现的行为?

最佳答案

我会在这里看到2个选项:


创建一个包含联系人姓名的无口音版本和对实际联系人ID的引用的表
用?代替重音符号?在您的搜索中(这可能不会真正导致用户期望的行为,但是要简单得多)

10-07 12:59