我想用android studio创建一个聊天应用,当我想在应用中显示用户时,应用崩溃了,代码如下:
private void readChats()
{
mUsers = new ArrayList<>();
reference = FirebaseDatabase.getInstance().getReference("Users");
reference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot)
{
mUsers.clear();
for (DataSnapshot snapshot : dataSnapshot.getChildren())
{
User user = snapshot.getValue(User.class);
for (String id : userList){
assert user != null;
if (user.getId().equals(id)) {
if (mUsers.size() != 0) {
for (User user1 : mUsers) {
if (!user.getId().equals(user1.getId())) {
mUsers.add(user);
}
}
}else {
mUsers.add(user);
}
}
}
}
userAdapter = new UserAdapter(getContext(), mUsers);
recyclerView.setAdapter(userAdapter);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError)
{
}
});
}
我的错误在下面:
java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.next(ArrayList.java:831)
at com.example.mahdi.chatapp.Fragments.ChatsFragment$2.onDataChange(ChatsFragment.java:101)
以及此行中的错误:
for (User user1 : mUsers)
我无法解决此错误,请帮助我
答案 0 :(得分:1)
您不能循环更改此列表(“ mUsers”),因为循环使用计数项作为限制。 如果您使temp变量,或使用此代码:
for (User user : new ArrayList< User >(mUsers)) {
if (!user.getId().equals(user1.getId())) {
}
}
我希望对您有帮助
答案 1 :(得分:1)
如果您使用普通的for循环而不是增强的for循环,则可以解决问题。
答案 2 :(得分:1)
if (mUsers.size() != 0) {
for (User user1 : mUsers) {
if (!user.getId().equals(user1.getId())) {
mUsers.add(user);
}
}
}else {
mUsers.add(user);
}
除了ConcurrentModificationException
(来自mUsers.add(user)
循环内的mUsers
)之外,我认为这不是您想要的逻辑。这会将user
添加到列表N次,其中N是列表中具有不同ID的用户数。
我怀疑您可能想要以下内容:
if (mUsers.stream().noneMatch(u -> user.getId().equals(u.getId())) {
mUsers.add(user);
}
如果没有其他具有该ID的用户,则添加一次user
。
您还可以考虑使用Map<String, User>
,其中密钥是用户的ID。然后,您可以使用:
map.computeIfAbsent(user.getId(), k -> user);
答案 3 :(得分:0)
我太面对这个问题了。 最好使用下面的代码片段,以确保在ChatFragment中仅添加了一个用户。
reference=FirebaseDatabase.getInstance().getReference("Users");
reference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
mUsers.clear();
for(DataSnapshot snapshot:dataSnapshot.getChildren()){
User user=snapshot.getValue(User.class);
//Display 1 user from chat
for (String id:usersList){
assert user != null;
if(user.getId().equals(id)){
if(mUsers.size()!=0){
int flag=0;
for(User u : mUsers) {
if (user.getId().equals(u.getId())) {
flag = 1;
break;
}
}
if(flag==0)
mUsers.add(user);
}else{
mUsers.add(user);
}
}
}
}
userAdapter=new UserAdapter(getContext(),mUsers,true);
recyclerView.setAdapter(userAdapter);
谢谢