java - Android/Firebase - 如何将检索到的数据添加到 ArrayList
问题描述
我在尝试这样做时遇到了一些问题,因为数据是异步加载的。
我有一个 recyclerView,我需要将数据推送到一个列表中,以便可以在屏幕上显示信息进行回收,但事实证明这样做有点困难。
这就是我到目前为止得到的:
refQuestions.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
Question question = dataSnapshot.getValue(Question.class);
arrayList.add(question.title);
Log.d("MyApp", question.title);
}
我希望代码在这里有点“停止”,并且只有在数据完全加载到我的数组中之后才继续执行,就像某种回调一样。
解决方案
您可以使用addChildEventListener
或者您可以使用addListenerForSingleValueEvent
,如下面的代码所示:
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
List<String> arrayList = new ArrayList<>();
for(DataSnapshot ds : dataSnapshot.getChildren()) {
Question question = ds.getValue(Question.class);
arrayList.add(question.title);
}
//Do what you need to do with your arrayList
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Log.d(TAG, databaseError.getMessage());
}
};
refQuestions.addListenerForSingleValueEvent(valueEventListener);
如您所见,此问题的快速解决方法是使用arrayList
only insideonDataChange()
方法。如果你想在外面使用它,我建议你从这篇文章中查看我的答案的最后一部分,我在其中解释了如何使用自定义回调来完成它。您也可以观看此视频以更好地理解。
推荐阅读
- html - 设计复制问题
- json - Swift 与 WHMCS API 交互
- excel - Excel - 用于多个工作表、列和行的 SUMIF
- asp.net - 如何将数据从 ajax 发送到在每个访问的页面上运行的基本控制器方法
- ios - Swift - 如何将平面 json 解码为嵌套结构?
- ios - 使用 AVAudioRecorder 的多个无法解释的错误消息
- python - 通过 Django 访问其他站点
- firebase - 如何将所有 Firestore 文档从导出导入到特定集合
- laravel - 通知消息不会隐藏 laravel
- javascript - d3 图表不会在 UIkit 框架中居中