【发布时间】:2021-10-03 22:23:01
【问题描述】:
我正在尝试从 Firebase 实时数据库中检索数据,并希望在 TextView 的屏幕上显示它们,但遇到错误。
ChatListFragment 类的代码如下:
public class ChatListFragment extends Fragment {
FirebaseAuth firebaseAuth;
RecyclerView recyclerView;
List<ModelChatlist> chatlistList;
List<ModelUser> userList;
DatabaseReference reference;
FirebaseUser currentUser;
AdapterChatlist adapterChatlist;
public ChatListFragment(){
//required empty
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_chat_list, container, false);
firebaseAuth = FirebaseAuth.getInstance();
currentUser = FirebaseAuth.getInstance().getCurrentUser();
recyclerView = view.findViewById(R.id.recyclerView);
chatlistList = new ArrayList<>();
reference = FirebaseDatabase.getInstance().getReference("Chatlist").child(currentUser.getUid());
reference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
chatlistList.clear();
for (DataSnapshot ds: dataSnapshot.getChildren()) {
ModelChatlist chatlist = ds.getValue(ModelChatlist.class);
chatlistList.add(chatlist);
}
loadChats();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
return view;
}
private void loadChats() {
userList = new ArrayList<>();
reference = FirebaseDatabase.getInstance().getReference("Users");
reference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
userList.clear();
for (DataSnapshot ds: dataSnapshot.getChildren()) {
ModelUser user = ds.getValue(ModelUser.class);
for (ModelChatlist chatlist: chatlistList){
if (user.getUid() != null && user.getUid().equals(chatlist.getId())) {
userList.add(user);
break;
}
}
adapterChatlist = new AdapterChatlist(getContext(), userList);
recyclerView.setAdapter(adapterChatlist);
for (int i=0; i<userList.size(); i++ ) {
lastMessage(userList.get(i).getUid());
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
private void lastMessage(String userId) {
DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Chats");
reference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
String theLastMessage = "default";
for (DataSnapshot ds: dataSnapshot.getChildren()) {
ModelChat chat = ds.getValue(ModelChat.class);
if (chat==null) {
continue;
}
String sender = chat.getSender();
String receiver = chat.getReceiver();
if (sender == null || receiver == null) {
continue;
}
if (chat.getReceiver().equals(currentUser.getUid()) &&
chat.getSender().equals(userId) ||
chat.getReceiver().equals(userId) &&
chat.getSender().equals(currentUser.getUid())){
theLastMessage = chat.getMessage();
}
}
adapterChatlist.setLastMessageMap(userId, theLastMessage);
adapterChatlist.notifyDataSetChanged();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
ModelChatList 的代码如下
public class ModelChatlist {
String id;
public ModelChatlist(String id) {
this.id = id;
}
public ModelChatlist() {
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
我试图在 Firebase 中显示这些子节点的值,但由于错误而无法这样做。
【问题讨论】:
-
这通常意味着您正在从数据库中读取单个项目,但需要一个项目列表。您在数据库中
getReference("Chatlist").child(currentUser.getUid())有哪些数据?请将其作为文本添加到您的问题中(无屏幕截图)。您可以通过单击Firebase Database console 上溢出菜单 (⠇) 中的“导出 JSON”链接来获取此信息。 -
请编辑您的问题并添加 Frank van Puffelen 要求的信息,并回复@。
标签: java android firebase-realtime-database