Я пытаюсь создать приложение чата и показать пользователям, с кем общался текущий пользователь, но когда я использую Listener для Single Event, пользователи добавляются в чаты после того, как пользователи перезапускают его приложение, и когда я использую Value Event Listener, пользователи дублируются в чаты фрагменты в режиме реального времени, но каждый раз, когда другой пользователь возобновляет деятельность.
Мой код
public class Chats extends Fragment {
private RecyclerView recyclerView;
private ChatsFragmentAdapter chatsFragmentAdapter;
FloatingActionButton profile, credentials;
DatabaseReference rootRef;
DatabaseReference ChatlistRef;
ValueEventListener mValueEventListener;
private List<User> mUsers;
String TAG = "Tag2";
;
int UserListSize;
public Chats() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_chats, container, false);
profile = view.findViewById(R.id.fab_edit_profile_pic);
credentials = view.findViewById(R.id.fab_edit_name);
FabAction();
recyclerView = view.findViewById(R.id.recycler_view);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
//new ItemTouchHelper(simpleCallback).attachToRecyclerView(recyclerView);
mUsers = new ArrayList<>();
chatlist_loop();
return view;
}
private void chatlist_loop() {
//mUsers.clear();
chatsFragmentAdapter = new ChatsFragmentAdapter(getContext(), mUsers);
recyclerView.setAdapter(chatsFragmentAdapter);
chatsFragmentAdapter.notifyDataSetChanged();
String fuser;
fuser = FirebaseAuth.getInstance().getCurrentUser().getUid();
rootRef = FirebaseDatabase.getInstance().getReference();
ChatlistRef = rootRef.child("Chatlist").child(fuser);
ChatlistRef.keepSynced(true);
mValueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot ds : dataSnapshot.getChildren()) {
String userID = ds.getKey();
DatabaseReference UserRef = FirebaseDatabase.getInstance().getReference("Users").child(userID);
Log.d(TAG, " UserRef : " + UserRef);
ValueEventListener eventListener = new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
User user = dataSnapshot.getValue(User.class);
mUsers.add(user);
chatsFragmentAdapter.notifyDataSetChanged();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
};
UserRef.addValueEventListener(eventListener);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.d(TAG, "loadPost:onCancelled", databaseError.toException());
}
};
ChatlistRef.addValueEventListener(mValueEventListener);
}
}