Java Firebase RealtimeDatabase onDataChange方法不在全局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

我正在用java做一个android项目。我从firebase实时数据库读取数据没有问题。但在我尝试将写入的数据写入ArrayList之后,它仍然看起来是空的

我的全局数组:

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)
会运行。有关这一点的原因以及解决方法的解释,请参见我的回答: