我想实现T9搜索,就像android本地拨号或TrueCaller拨号一样。到目前为止,我取得的成就是:
将击键转换为字符串模式,例如如果我在拨号程序上按2,它会给我"abc“、"ac”、"ca“等等。
现在我问了一个问题
字符串选择=Utility.getSelectionLikeWithIn(Mmemonic);
游标查询= getContentResolver().query(ContactsContract.Contacts.CONTENT_URI,空,选择,空,空);‘
公共静态字符串getSelectionLikeWithIn(列表mmemonics) {
String selection = "";
for (int i = 0; i < mmemonics.size(); i++) {
selection = selection + " display_name LIKE '";
selection = selection + mmemonics.get(i);
if (i == mmemonics.size() - 1){
selection = selection + "%'";
}else {
selection = selection + "%' OR";
}
}
return selection;
}'上面的方法将字符串的数组列表转换为where子句
display_name喜欢'ab%‘或者display_name喜欢'abc%’等等.
这给了我由于复杂的查询而导致的低效结果和应用程序崩溃.
请建议我如何执行一个查询来匹配类似我的击键或操作系统在ContactsProvider中的任何其他方式来执行这样的智能搜索
发布于 2016-11-29 15:28:48
如果你要刷新每一个数字的列表,按下这个技术就不能工作了,因为它太慢了。
更好的选择是从 DB中读取的所有联系人名称,并将它们存储在一个简单的ArrayList<String>或类似的集合中,最好是在读取名称时将它们转换为toLowerCase(),以便在下一步更容易地进行搜索。
接下来,对于按下的每一个数字,从输入的数字构建一个正则表达式模式,例如"234“将转换为模式.*[abc][def][ghi].*。
构建模式之后,遍历名称列表,并返回与模式匹配的名称。
https://stackoverflow.com/questions/40457293
复制相似问题