我有一个静态方法来获取集合中的所有文档。我在创建要返回的这些文档数组时遇到了麻烦。我该怎么办?让我们将数组列表称为“ allItems”。我的方法是将在for循环中创建的每个项目添加到allItems数组列表中,但是当我返回该列表并且android studio提示我将数组列表定为最终列表时,该列表为null。
public static ArrayList<Item> geAllFromFireStore() {
FirebaseFirestore db = FirebaseFirestore.getInstance();
ArrayList<Item> allItems = new ArrayList<>();
db.collection("Items")
.get()
.addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
for (QueryDocumentSnapshot document : task.getResult()) {
Log.d(TAG, document.getId() + " => " + document.getData());
String name = document.get("name") + "";
String categoryName = document.get("category") + "";
Item item = new Item(name, category);
// I would like to add these items to an array list and return that array list
}
} else {
Log.w(TAG, "Error getting documents.", task.getException());
}
}
});
return allItems;
}
答案 0 :(得分:1)
我用Kotlin编写,因此请在您的代码中进行修改。
// Declare variable that use to collect DocumentSnapshot
private lateinit var list: MutableList<DocumentSnapshot>
// In addOnCompleteListener…
if(task.isSuccessful){
lstMAP = mutableListOf<DocumentSnapshot>()
lstMAP.clear()
lstMAP.addAll(task.result!!.documents)
} else {
Log.d("doc", "0 doc")
}
答案 1 :(得分:1)
但是此列表在我返回时为空,并且android studio提示我将数组列表定为最终列表。
使它最终定好没有任何问题,并且给出该代码后,它不可能返回null,但很可能是 empty ,因为它实际上是在Firebase甚至试图进行远程操作之前返回的数据库查询。
这就是异步的问题-您需要等待结果,然后才能返回结果。
例如,参数化获取快照的侦听器
public static void getAllFromFireStore(OnCompleteListener<QuerySnapshot> listener) {
FirebaseFirestore db = FirebaseFirestore.getInstance();
db.collection("Items").get().addOnCompleteListener(listener);
}
就是这样。
从那里,重构其余代码以传递到您已经编写的侦听器中,而不是实际期望从方法调用中返回对象
API.getAllFromFireStore(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
// TODO: get data
}
});
在其中,您可以填充RecyclerView适配器,例如