Solution 1 :
this loop occurs concurrentModificationException
for (User user1 : mUsers) {
if (!user.getId().equals(user1.getId())) {
mUsers.add(user);
}
}
because you modifies mUsers
while you goes throw items of mUsers
make it this way
boolean containsUser = false;
for (User user1 : mUsers) {
if (user.getId().equals(user1.getId())) {
containsUser = true;
}
}
if (!containsUser) {
mUsers.add(user);
}
Problem :
I am creating a simple message app
and everytime I click
on a new user to message
and after clicking on send icon
I get the following error concurrentModificationException in ArrayList
in the readChats()
onDataChanged(@NonNull DataSnapshot dataSnapshot)
function
. I have done research and I’ve come across Iterator
but not sure how to implement
it to my code.
Code
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) {
}
});
}
}