ArrayList $ Itr.next引发错误current并发ModificationException

问题描述 投票:1回答:1

我正在创建一个simple message app,每次我在click上创建new user to message,然后单击send icon后,在concurrentModificationException in ArrayListreadChats()onDataChanged(@NonNull DataSnapshot dataSnapshot)中都会收到以下错误function。我已经进行了研究,遇到过Iterator,但不确定如何将其implement转换为我的代码。

代码

public class ChatsFragment extends Fragment {

    private RecyclerView recyclerView;

    private UserAdapter userAdapter;
    private List<User> mUsers;

    FirebaseUser fuser;
    DatabaseReference reference;

    private List<String> usersList;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
      View view = inflater.inflate(R.layout.fragment_chats, container, false);

      recyclerView = view.findViewById(R.id.recycler_view);
      recyclerView.setHasFixedSize(true);
      recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));

      fuser = FirebaseAuth.getInstance().getCurrentUser();

      usersList = new ArrayList<>();

      reference = FirebaseDatabase.getInstance().getReference("Chats");
      reference.addValueEventListener(new ValueEventListener() {
          @Override
          public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
              usersList.clear();

              for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                  Chat chat = snapshot.getValue(Chat.class);

                  if (chat.getSender().equals(fuser.getUid())) {
                      usersList.add(chat.getReceiver());
                  }
                  if (chat.getReceiver().equals(fuser.getUid())) {
                      usersList.add(chat.getSender());
                  }
              }
              readChats();
          }

          @Override
          public void onCancelled(@NonNull DatabaseError databaseError) {

          }
      });
      return view;
    }
    private void readChats() {
        mUsers = new ArrayList<>();

        reference = FirebaseDatabase.getInstance().getReference("Users");

        reference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                mUsers.clear();
                //Display 1 user from chats
                for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                    User user = snapshot.getValue(User.class);
                    for (String id : usersList) {
                        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, true);
                recyclerView.setAdapter(userAdapter);
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });
    }
}
android firebase-realtime-database arraylist iterator
1个回答
0
投票
for (User user1 : mUsers) { if (!user.getId().equals(user1.getId())) { mUsers.add(user); } }

因为您在旅途中修改mUsers时会抛出mUsers的项目

以这种方式进行

boolean containsUser = false; for (User user1 : mUsers) { if (user.getId().equals(user1.getId())) { containsUser = true; } } if (!containsUser) { mUsers.add(user); }

© www.soinside.com 2019 - 2024. All rights reserved.