Java Firebase RealtimeDatabase onDataChange方法不在全局ArrayList中存储数据
我正在用java做一个android项目。我从firebase实时数据库读取数据没有问题。但在我尝试将写入的数据写入ArrayList之后,它仍然看起来是空的 我的全局数组:Java Firebase RealtimeDatabase onDataChange方法不在全局ArrayList中存储数据,java,android,firebase,firebase-realtime-database,arraylist,Java,Android,Firebase,Firebase Realtime Database,Arraylist,我正在用java做一个android项目。我从firebase实时数据库读取数据没有问题。但在我尝试将写入的数据写入ArrayList之后,它仍然看起来是空的 我的全局数组: private ArrayList<String> admins = new ArrayList<>(); public void getAdmins() { adminler.clear(); myRefAdmins.addValueEventListener(n
private ArrayList<String> admins = new ArrayList<>();
public void getAdmins() {
adminler.clear();
myRefAdmins.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
for(DataSnapshot dataSnapshot: snapshot.getChildren())
{
admins.add(dataSnapshot.getValue().toString());
/*
System.out.println(dataSnapshot.getValue().toString());
System.out.println(admins.get(0));
Both two lines above give the correct value, adding
those lines for extra information
*/
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
System.out.println(error.getMessage());
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getAdmins();
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu_items, menu);
MenuItem report = menu.findItem(R.id.reports);
String user = Objects.requireNonNull(Objects.requireNonNull(mFirebaseAuth.getCurrentUser()).getEmail()).substring(0, Objects.requireNonNull(Objects.requireNonNull(mFirebaseAuth.getCurrentUser()).getEmail()).indexOf("@"));
if(!admins.contains(user))
report.setVisible(false);
return true;
}
这是我读取数据的方法。经过测试,从数据库获取数据没有问题
组合框菜单:
private ArrayList<String> admins = new ArrayList<>();
public void getAdmins() {
adminler.clear();
myRefAdmins.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
for(DataSnapshot dataSnapshot: snapshot.getChildren())
{
admins.add(dataSnapshot.getValue().toString());
/*
System.out.println(dataSnapshot.getValue().toString());
System.out.println(admins.get(0));
Both two lines above give the correct value, adding
those lines for extra information
*/
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
System.out.println(error.getMessage());
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getAdmins();
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu_items, menu);
MenuItem report = menu.findItem(R.id.reports);
String user = Objects.requireNonNull(Objects.requireNonNull(mFirebaseAuth.getCurrentUser()).getEmail()).substring(0, Objects.requireNonNull(Objects.requireNonNull(mFirebaseAuth.getCurrentUser()).getEmail()).indexOf("@"));
if(!admins.contains(user))
report.setVisible(false);
return true;
}
此代码正在设置我的组合框菜单项。我想只为管理员成员显示报告屏幕,所以如果用户不是管理员,我会将报告屏幕设置为不可见。但是adminsArrayList始终显示为空。在调用onDataChange
之前,admins.contains(user)
会运行。有关这一点的原因以及解决方法的解释,请参见我的回答: