java - 为什么不能从firebase扫描数据
问题描述
我在 onStart 方法中从 firebase 获取数据并将它们放入 Arraylist(user_words) 中。但在 onCreateView 方法中,我的 Arraylist 看起来是空的。但是在 onstart 中,arraylist 看起来很满。我在不同的班级做过同样的事情,而且效果很好。但这一次失败了。我不明白我的错是什么?
private DatabaseReference databaseReference2 = FirebaseDatabase.getInstance().getReference("kullanici_kelime");
private ArrayList<User_word> user_words= new ArrayList<>();
@Override
public void onStart(){
super.onStart();
databaseReference2.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
user_words.clear();
for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
User_word user_word= new User_word();
user_word.setMean(postSnapshot.child("mean").getValue(String.class)) ;
user_word.setName(postSnapshot.child("name").getValue(String.class));
user_word.setKey(postSnapshot.child("key").getValue(String.class));
user_word.setKey(postSnapshot.child("id").getValue(String.class));
user_words.add(user_word);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view =inflater.inflate(R.layout.fragment_frag3, container,false);
rv= (RecyclerView)view.findViewById(R.id.rv2);
rv.setHasFixedSize(true);
rv.setLayoutManager(new LinearLayoutManager(this.getActivity()));
Log.e("wordssize",Integer.toString(user_words.size()));
adapter= new CardAdapter2_2(getActivity(),user_words);
rv.setAdapter(adapter);
return view;
}
解决方案
addValueEventListener
是异步的,并在数据库查询完成之前立即返回。只要数据可用,您传递给它的回调将在一段时间后调用。在填充数据之前,您不应该尝试使用该数组,这意味着您应该只更新活动的 UI,直到最终调用该回调。
推荐阅读
- python - 如何按多个条件拆分字符串?
- java - OneToMany 双向关系不显示孩子
- automation - 如何在 Azure Devops 的同一管道中使用“复制文件到:”任务两次
- java - 通过 JMX 对 Apache Ignite 进行 Prometheus 监控
- excel - 更改 Email.htmlbody 中单个单词的颜色
- reactjs - 压缩包数据似乎已损坏。再试一次
- typescript - 打字稿:如何重新定义类的静态方法签名
- c# - 写入文件时编码错误(俄语语言)
- javascript - 如何在javascript中生成多个ulr?
- c# - 仅从 Word 文档中每隔一页打印一次。我怎样才能做到这一点?