Java 整个ArrayList包含相同的数据
我创建了以下方法,为用户电话簿中的每个联系人添加姓名和号码:Java 整个ArrayList包含相同的数据,java,android,Java,Android,我创建了以下方法,为用户电话簿中的每个联系人添加姓名和号码: PlayerDetails contactPlayer = new PlayerDetails(); public PlayerList getContacts(){ ContentResolver cr = calledActivity.getContentResolver(); Cursor contactList = cr.query(ContactsContract.CommonDataKinds.Phone
PlayerDetails contactPlayer = new PlayerDetails();
public PlayerList getContacts(){
ContentResolver cr = calledActivity.getContentResolver();
Cursor contactList = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,null,null,null);
while (contactList.moveToNext()){
contactPlayer.name = contactList.getString(contactList.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
contactPlayer.number = contactList.getString(contactList.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
playerNameNumber.myPlayers.add(pos,contactPlayer);
//playerNameNumber.add(pos,name + " " + phoneNumber);
pos++;
}
return playerNameNumber;
}
但每个位置包含相同的数据。
当我调试时,我可以看到在while循环中,它通过每个联系人,在contactPlayer.name和number,它每次都有一个不同的联系人,但在:
playerNameNumber.MyPlayer.add将数据添加到每个位置。
那么playerNameNumber[0]和playerNameNumber[1]具有相同的联系信息
playerNameNumber is an object with the following:
ArrayList<PlayerDetails> myPlayers = new ArrayList<>();
void addPlayer(PlayerDetails player){
myPlayers.add(player);
}
是while循环导致了这个问题吗?
另外,我知道我有“pos”,但我确定我不需要这个
为什么“添加”用相同的数据替换arraylist中的每个项目?对于相同的contactPlayer您正在分配新的名称和号码。
无法查看其在循环中的实例化位置。因此,每次将它们添加到列表中时,它们都指向同一对象,并且将包含循环中最后添加的名称和号码。对于相同的contactPlayer您正在分配新的名称和号码。
无法查看其在循环中的实例化位置。因此,每次将它们添加到列表中时,它们都指向同一个对象,并且将包含循环中最后添加的名称和编号。您必须在每次运行
时实例化播放详细信息,而循环将指向同一位置(最后一个联系人)
每次运行而循环时,您必须实例化PlayerDetails
,否则它将指向同一位置(最后一个联系人)
看起来您正在添加相同的对象引用。在moveToNext()
之后,是否需要创建一个新的contactPlayer,然后设置名称和号码?contactPlayer实例在哪里?在while循环中看不到它,并且您调用列表attribute myplayers的add方法(但是为什么要使用addPlayer方法)在添加时创建一个新实例。@KevinO-Yea I doIt看起来您正在添加相同的对象引用。在moveToNext()
之后,是否需要创建一个新的contactPlayer,然后设置名称和号码?contactPlayer实例在哪里?在while循环中看不到它,您也调用了list attribute myplayers的add方法(但为什么要使用addPlayer方法)在添加时创建一个新实例。@KevinO-Yea I doIt是在类中全局添加的,但我认为在while循环中它会将其设置为新的名称和编号?它是在类中全局添加的,但是我认为在while循环中它会将其设置为新的名称和编号?它会在类中全局添加,但我认为在while循环中它会将其设置为新的名称和编号?它会在类中全局添加,但我认为在while循环中它会将其设置为新的名称和编号?
int id;
String name;
String number;
public PlayerList getContacts(){
ContentResolver cr = calledActivity.getContentResolver();
Cursor contactList = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,null,null,null);
while (contactList.moveToNext()){
contactPlayer = new PlayerDetails();
contactPlayer.name = contactList.getString(contactList.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
contactPlayer.number = contactList.getString(contactList.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
playerNameNumber.myPlayers.add(pos,contactPlayer);
//playerNameNumber.add(pos,name + " " + phoneNumber);
pos++;
}
return playerNameNumber;
}