ArrayList数据重复问题:通讯录联系人获取方法异常求助
解决通讯录联系人列表数据重复的问题
嘿,我一眼就瞅出你代码里的问题啦!你把PlayerDetails对象的创建放在了while循环外面,这就导致每次循环都是在同一个对象实例上修改姓名和号码属性,然后把这个对象重复添加到列表里。因为ArrayList存储的是对象的引用,所以最后列表里所有元素指向的都是同一个对象,自然显示的全是最后一次循环修改的联系人数据。
修正后的代码
把PlayerDetails的实例化移到while循环内部,每次循环都创建一个新的对象,这样每个联系人对应一个独立的实例,就不会出现重复数据了:
public PlayerList getContacts(){ ContentResolver cr = calledActivity.getContentResolver(); Cursor contactList = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,null,null,null); PlayerList playerList = new PlayerList(); // 假设这是存储联系人的列表容器 while (contactList.moveToNext()){ // 每次循环都创建新的PlayerDetails对象 PlayerDetails contactPlayer = new PlayerDetails(); contactPlayer.name = contactList.getString(contactList.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)); contactPlayer.phoneNumber = contactList.getString(contactList.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); playerList.add(contactPlayer); // 将独立的联系人对象添加到列表 } // 别忘了关闭Cursor,避免内存泄漏 if (contactList != null && !contactList.isClosed()) { contactList.close(); } return playerList; }
额外注意事项
- 确保你已经在AndroidManifest.xml中声明了
READ_CONTACTS权限,并且在Android 6.0及以上版本中完成了运行时权限申请,否则会无法读取通讯录。 - 处理Cursor时一定要记得关闭,也可以用try-with-resources语法自动管理Cursor生命周期,避免内存泄漏:
try (Cursor contactList = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,null,null,null)) { PlayerList playerList = new PlayerList(); while (contactList.moveToNext()){ PlayerDetails contactPlayer = new PlayerDetails(); contactPlayer.name = contactList.getString(contactList.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)); contactPlayer.phoneNumber = contactList.getString(contactList.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); playerList.add(contactPlayer); } return playerList; } catch (Exception e) { e.printStackTrace(); return new PlayerList(); }
内容的提问来源于stack exchange,提问作者user9607849
相关产品推荐
相关产品推荐

