You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:34:38