java - 为什么插入多个项目后数组列表 ratingItemList 显示为空?

标签 java android firebase google-cloud-firestore

当它在文档快照循环中时,它会将评级添加到 ratingItemList。我肯定知道这一点,因为我还在日志中打印列表的大小并且它正在增加。 但是在它退出该循环之后,为了确保我检查它是否为空,并在日志中打印空列表。 你们能帮我找出错误吗?

package com.example.ratingapp;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;

import com.google.android.gms.tasks.OnSuccessListener;
import com.google.firebase.firestore.DocumentSnapshot;
import com.google.firebase.firestore.FirebaseFirestore;
import com.google.firebase.firestore.QuerySnapshot;

import java.util.ArrayList;
import java.util.List;

public class YourRating extends AppCompatActivity {
private List<ratingItem> ratingItemList;
private FirebaseFirestore db;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_your_rating);

        ratingItemList=new ArrayList<>();



        db = FirebaseFirestore.getInstance();
        db.collection("userRatings").get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
            @Override
            public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
                if(!queryDocumentSnapshots.isEmpty()){
                    Log.d("Check1","Ratings Exist");
                    List<DocumentSnapshot> documentSnapshots = queryDocumentSnapshots.getDocuments();
                    for(DocumentSnapshot doc : documentSnapshots) {
                        String rating = doc.getString("Rating");
                        //Log.d("Rating",rating);
                        com.google.firebase.Timestamp date = doc.getTimestamp("Date");
                        //Log.d("Date",date.toString());
                        ratingItem newRatingItem = new ratingItem(rating, date);
                        Log.d("Rating", newRatingItem.getRating());
                        Log.d("Date", newRatingItem.getTimestamp().toString());


                        ratingItemList.add(newRatingItem);
                        Log.d("Size ",String.valueOf(ratingItemList.size()));

                    }
                }
                else{
                    Toast.makeText(YourRating.this,"No ratings available!",Toast.LENGTH_LONG).show();
                }
            }
        });


        if(ratingItemList.isEmpty()){
            Log.d("Empty","Empty List");
        }
        for(ratingItem r: ratingItemList){
            Log.d("Rating1",r.getRating());
            Log.d("Date1",r.getTimestamp().toString());
        }
    }

}

最佳答案

如果您在第一行调用后台线程结果并在下一行打印它,则您的回调方法不能保证在下一行之前运行。它将开始执行第一行的线程,并且不等待响应运行下一行。所以你把它弄空了。

也在回调onSuccess()方法中检查列表大小,在for循环之后:

public class YourRating extends AppCompatActivity {
private List<ratingItem> ratingItemList;
private FirebaseFirestore db;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_your_rating);

    ratingItemList = new ArrayList<>();


    db = FirebaseFirestore.getInstance();
    db.collection("userRatings").get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
        @Override
        public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
            if (!queryDocumentSnapshots.isEmpty()) {
                Log.d("Check1", "Ratings Exist");
                List<DocumentSnapshot> documentSnapshots = queryDocumentSnapshots.getDocuments();
                for (DocumentSnapshot doc : documentSnapshots) {
                    String rating = doc.getString("Rating");
                    //Log.d("Rating",rating);
                    com.google.firebase.Timestamp date = doc.getTimestamp("Date");
                    //Log.d("Date",date.toString());
                    ratingItem newRatingItem = new ratingItem(rating, date);
                    Log.d("Rating", newRatingItem.getRating());
                    Log.d("Date", newRatingItem.getTimestamp().toString());


                    ratingItemList.add(newRatingItem);
                    Log.d("Size ", String.valueOf(ratingItemList.size()));

                }
                if (ratingItemList.isEmpty()) {
                    Log.d("Empty", "Empty List");
                }
                for (ratingItem r : ratingItemList) {
                    Log.d("Rating1", r.getRating());
                    Log.d("Date1", r.getTimestamp().toString());
                }
            } else {
                Toast.makeText(YourRating.this, "No ratings available!", Toast.LENGTH_LONG).show();
            }
        }
    });

}

}

关于java - 为什么插入多个项目后数组列表 ratingItemList 显示为空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61080499/

相关文章:

javascript - Firebase 函数返回 "Response is not valid JSON object."

java - Groovy 编译期间出现 StackOverflowError

android - 此标签及其子标签可以替换为一个 <TextView/> 和一个复合可绘制对象 : picture and text

java - 无法转换 java.util.Arraylist 类型的对象 从 Firebase 实时数据库嵌套对象读取

java - String 类型的值无法转换为 JSONObject

java - fragment 上的 MapFragment

android - 如何计算Google控制台或Firebase控制台中平板电脑设备的百分比?

java - Blackberry 上的 XML 解析问题

java - Google App Engine Java 世界中的 MVC

java - 在 Java 中使用 for 循环,是否必须指定 not null?