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的最后一部分,其中我已解释了如何使用自定义回调来完成此操作。您也可以查看此以更好地理解。可能重复的