Java 如何获取addValueEventListener中更新的arraylist的值?

Java 如何获取addValueEventListener中更新的arraylist的值?,java,android,asynchronous,arraylist,firebase-realtime-database,Java,Android,Asynchronous,Arraylist,Firebase Realtime Database,我想从查询得到的ArrayList中显示一个listview。 addValueEventListener中的ArrayList pt在addValueEventListener之外变为null,尽管ArrayList声明为静态属性。 是否有任何方法可以在此eventlistener之外获取ArrayList的值? query.addValueEventListener(new ValueEventListener() { @Override public void onData

我想从查询得到的
ArrayList
中显示一个
listview
。 addValueEventListener中的
ArrayList pt在addValueEventListener之外变为
null
,尽管
ArrayList
声明为静态属性。 是否有任何方法可以在此
eventlistener之外获取
ArrayList
的值?

query.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        if(dataSnapshot!=null) {
            Log.e("TAG", String.valueOf(dataSnapshot.child("uid").child("Name")));
            int i=0;
            for(DataSnapshot snapshot : dataSnapshot.getChildren()){
                String userName = snapshot.child("Name").getValue(String.class);
                Pt.add(userName);
                //Toast.makeText(getApplicationContext(),  dataSnapshot.toString(), Toast.LENGTH_SHORT).show();
            }
        } else {
            Toast.makeText(getApplicationContext(), "Datasnapshot is null", Toast.LENGTH_SHORT).show();
         }
    }
请尝试此代码

private List<String> stringList=new ArrayList<>(); // define as class level

query.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
    if(dataSnapshot!=null) {
        Log.e("TAG", String.valueOf(dataSnapshot.child("uid").child("Name")));
        int i=0;
        for(DataSnapshot snapshot : dataSnapshot.getChildren()){
            String userName = snapshot.child("Name").getValue(String.class);
            Pt.add(userName);
            //Toast.makeText(getApplicationContext(),  dataSnapshot.toString(), Toast.LENGTH_SHORT).show();
        }
    } else {
        Toast.makeText(getApplicationContext(), "Datasnapshot is null", Toast.LENGTH_SHORT).show();
     }
}
        ArrayAdapter<String>adapter=new ArrayAdapter<>(MainActivity.this,android.R.layout.simple_list_item_1,stringList);
    listView.setAdapter(adapter);
private List stringList=new ArrayList();//定义为类级别
addValueEventListener(新的ValueEventListener(){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
if(dataSnapshot!=null){
Log.e(“TAG”、String.valueOf(dataSnapshot.child(“uid”).child(“Name”));
int i=0;
对于(DataSnapshot快照:DataSnapshot.getChildren()){
字符串userName=snapshot.child(“Name”).getValue(String.class);
Pt.add(用户名);
//Toast.makeText(getApplicationContext(),dataSnapshot.toString(),Toast.LENGTH_SHORT).show();
}
}否则{
Toast.makeText(getApplicationContext(),“Datasnapshot为空”,Toast.LENGTH_SHORT.show();
}
}
ArrayAdapteradapter=新的ArrayAdapter(MainActivity.this,android.R.layout.simple\u list\u item\u 1,stringList);
setAdapter(适配器);

由于此方法的异步行为,您的
Pt
列表在
onDataChange()
之外总是
空的。这意味着,当您尝试在此方法之外使用
Pt
列表时,数据尚未从数据库加载完毕,因此无法访问

这个问题的一个快速解决方法是只在
onDataChange()中使用
Pt
列表
方法,或者如果您想在外部使用它,我建议您查看此中我的anwser的最后一部分,其中我已解释了如何使用自定义回调来完成此操作。您也可以查看此以更好地理解。

可能重复的