В основном, чтобы справиться с этой сложностью, сейчас я использую отдельные узлы только для хранения списков чата, поэтому мне не нужно читать чаты для фильтрации последних чатов.
Приведенный ниже код предназначен для создания нового узла каждый раз, когда пользователь отправляет сообщение, он будет обновлять узел, если recieverID отличается.
dbrefChatList = FirebaseDatabase.getInstance().
getReference("BaatCheet/ChatList/")
.child(senderuserID)
.child(receiveruserID);
dbrefChatList.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if (!dataSnapshot.exists()){
dbrefChatList.child("id").setValue(receiveruserID);
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
Таким образом, ChatList является классом модели, который содержит одну строку с именем «id», и этот идентификатор будет использоваться для поиска в узле.
Приведенный ниже код предназначен для фрагмента ChatFragment, который извлекает chatList из firebase и устанавливает данные в представление переработчика.
// private List<ChatList> chatList; Declaration at top
chatListList = new ArrayList<>();
firebaseUser = FirebaseAuth.getInstance().getCurrentUser();
databaseReference = FirebaseDatabase
.getInstance()
.getReference("BaatCheet/ChatList")
.child(firebaseUser.getUid());
databaseReference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
chatListList.clear();
for (DataSnapshot snapshot : dataSnapshot.getChildren()){
ChatList chatList = snapshot.getValue(ChatList.class);
chatListList.add(chatList);
}
myChatList();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
Функция myChatList действует как функция readChat в постановке задачи.
private void myChatList() {
userModelList = new ArrayList<>();
databaseReference = FirebaseDatabase.getInstance().getReference("BaatCheet/Users/");
databaseReference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
userModelList.clear();
for (DataSnapshot snapshot : dataSnapshot.getChildren()){
UserModel userModel = snapshot.getValue(UserModel.class);
for (ChatList chatList : chatListList){
if (userModel.getId().equals(chatList.getId())){
userModelList.add(userModel);
}
}
}
usersAdapter = new UsersAdapter(userModelList);
recyclerView.setAdapter(usersAdapter);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}