Android Studio中筛选手机通讯录以指定字母开头的联系人
解决通讯录筛选以指定字母开头联系人的问题
你当前代码的核心问题是使用了=精确匹配,这只会找出名字**完全等于"A"**的联系人,而不是以"A"开头的。要实现前缀匹配,需要用SQL的LIKE操作符配合通配符%。
修改后的代码示例
val selectedContactsList: ArrayList<SelectedContactItem> = arrayListOf() val cursor = context.contentResolver.query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI, arrayOf( ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.NUMBER ), ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " LIKE ?", arrayOf("A%"), ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME ) cursor?.use { // 自动管理Cursor生命周期,避免内存泄漏 while (it.moveToNext()) { val contactName = it.getString(it.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)) val contactNumber = it.getString(it.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.NUMBER)) val contactItem = SelectedContactItem(contactNumber, contactName) selectedContactsList.add(contactItem) } }
额外优化建议
- 忽略大小写匹配:如果需要同时匹配"A"和"a"开头的联系人,修改筛选条件为:
ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " LIKE ? COLLATE NOCASE", arrayOf("A%"), - 更安全的列索引获取:用
getColumnIndexOrThrow替代getColumnIndex,列名错误时会直接抛出异常,便于快速排查问题。 - 自动关闭Cursor:使用
cursor?.use{}语法,无需手动调用cursor.close(),避免因忘记关闭导致的资源泄漏。
内容的提问来源于stack exchange,提问作者Ravi.Dudi
相关产品推荐
相关产品推荐

