Java Firebase-尝试将每个用户的数据检索到列表中
我的应用程序中的每个用户都可以发送和获取好友请求。当用户检查他的好友请求时,我希望应用程序检查发送给他的好友请求的每个用户,并从Java Firebase-尝试将每个用户的数据检索到列表中,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我的应用程序中的每个用户都可以发送和获取好友请求。当用户检查他的好友请求时,我希望应用程序检查发送给他的好友请求的每个用户,并从实时数据库中检索他的信息 这是我的代码,以实现这一点: public void check_For_Friends_And_Requests(){ String loggedUser=SaveSharedPreference.getLoggedEmail(getApplicationContext()); final Dat
实时数据库
中检索他的信息
这是我的代码,以实现这一点:
public void check_For_Friends_And_Requests(){
String loggedUser=SaveSharedPreference.getLoggedEmail(getApplicationContext());
final DatabaseReference mDatabase= FirebaseDatabase.getInstance().getReference();
final DatabaseReference userRef=mDatabase.child("Users").child(loggedUser);
userRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()){
final List<User> friendRequestsReceived_UserList=new ArrayList<>();
for (DataSnapshot postSnapshot: dataSnapshot.child("friend_requests_received").getChildren()) {
final String senderEmail=postSnapshot.getKey();
Toast.makeText(getApplicationContext(),
senderEmail, Toast.LENGTH_SHORT).show();
if (senderEmail!=null){
mDatabase.child("Users").child(senderEmail).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Toast.makeText(getApplicationContext(),
dataSnapshot.child("name").getValue(String.class), Toast.LENGTH_SHORT).show();
friendRequestsReceived_UserList.add(
new User(
senderEmail,
dataSnapshot.child("name").getValue(String.class),
dataSnapshot.child("level").getValue(Integer.class),
dataSnapshot.child("skill").getValue(Double.class)));
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
}
UserListAdapter friendRequestsReceived_Adapter =
new UserListAdapter(getApplicationContext(),
R.layout.friend_requests_received_listview_row,
friendRequestsReceived_UserList);
friendRequestsReceived_ListView.setAdapter(friendRequestsReceived_Adapter);
}
else
connectionErrorGoToMain();
}
@Override
public void onCancelled(DatabaseError databaseError) {
connectionErrorGoToMain();
}
});
}
当我将它们放在Inner侦听器中时,效果很好,但我不想为列表中的每个用户设置适配器,只在for
循环之后
我正在附加一个带有数据库结构的屏幕截图(我不需要获取所有参数):
列表为空,因为您在内部
onDataChange()
方法之外声明了friendRequestsReceived\u UserList
。这是由于在将这些新对象添加到列表之前调用了onDataChange()
方法的异步行为造成的。因此,为了解决这个问题,只需将列表的声明移动到内部onDataChange()
方法中,如下所示:
if (senderEmail!=null){
mDatabase.child("Users").child(senderEmail).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
final List<User> friendRequestsReceived_UserList=new ArrayList<>(); //Moved here
Toast.makeText(getApplicationContext(), dataSnapshot.child("name").getValue(String.class), Toast.LENGTH_SHORT).show();
friendRequestsReceived_UserList.add(
new User(
senderEmail,
dataSnapshot.child("name").getValue(String.class),
dataSnapshot.child("level").getValue(Integer.class),
dataSnapshot.child("skill").getValue(Double.class)));
UserListAdapter friendRequestsReceived_Adapter =
new UserListAdapter(getApplicationContext(), R.layout.friend_requests_received_listview_row, friendRequestsReceived_UserList);
friendRequestsReceived_ListView.setAdapter(friendRequestsReceived_Adapter);
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
if(senderEmail!=null){
mDatabase.child(“用户”).child(senderEmail).addListenerForSingleValueEvent(新值EventListener()){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
final List friendRequestsReceived_UserList=new ArrayList();//移动到此处
Toast.makeText(getApplicationContext(),dataSnapshot.child(“name”).getValue(String.class),Toast.LENGTH\u SHORT.show();
friendRequestsReceived_UserList.add(
新用户(
发送电子邮件,
dataSnapshot.child(“name”).getValue(String.class),
dataSnapshot.child(“level”).getValue(Integer.class),
dataSnapshot.child(“skill”).getValue(Double.class));
UserListAdapter friendRequestsReceived_适配器=
新的UserListAdapter(getApplicationContext(),R.layout.friend\u请求\u已接收\u listview\u行,friendRequestsReceived\u用户列表);
friendRequestsReceived_ListView.setAdapter(friendRequestsReceived_Adapter);
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
}
});
正如您可能看到的,我也在内部方法中设置了适配器。如果您想在
onDataChange()
之外使用该列表,我建议您阅读我的答案。我需要您查看您的Firebase数据structure@ILAYS_Kerbal我添加了一个屏幕截图,您所能做的就是…存储每个对象的列表,比如类的使用{List friendReuqest=new ArrayList();String name;}并在Ondata change侦听器中对friendReqest子级执行嵌套查询,将dataSnapshot传递给它,然后将setvalue传递给模型。首先获取列表,然后在模型中添加列表,并将其存储在userList dataSnapshot.getValue(User.class)中,如果我要在内部onDataChange()中设置适配器的话,我要在“for”循环中设置它,实际上为其中的每个对象设置它。我只想在“for”之后设置一次循环,当列表中充满对象时。由于需要使用嵌套查询,这意味着您需要异步加载数据两次,因此无法使用数据库结构实现此目的。如果在onDataChange()
方法之外使用该列表(不包括该方法)它总是空的。你有两种可能。使用我的答案,它工作得很好,或者改变你的数据库结构,只需要一个查询。我不明白,你在这篇文章中的答案是否有助于我将适配器放在“for”之后循环?如果是,我就不明白了。这是我从代码中的代码实现代码的尝试:我没有说在for循环内部或外部设置适配器。我只是说需要声明并使用ArrayList
insideonDataChange()
method,因为否则为null。因为ArrayList
包含该方法内部的信息,所以必须在该方法中设置适配器。
if (senderEmail!=null){
mDatabase.child("Users").child(senderEmail).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
final List<User> friendRequestsReceived_UserList=new ArrayList<>(); //Moved here
Toast.makeText(getApplicationContext(), dataSnapshot.child("name").getValue(String.class), Toast.LENGTH_SHORT).show();
friendRequestsReceived_UserList.add(
new User(
senderEmail,
dataSnapshot.child("name").getValue(String.class),
dataSnapshot.child("level").getValue(Integer.class),
dataSnapshot.child("skill").getValue(Double.class)));
UserListAdapter friendRequestsReceived_Adapter =
new UserListAdapter(getApplicationContext(), R.layout.friend_requests_received_listview_row, friendRequestsReceived_UserList);
friendRequestsReceived_ListView.setAdapter(friendRequestsReceived_Adapter);
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});