This question already has answers here:
How to return a DocumentSnapShot as a result of a method?
                                
                                    (2个答案)
                                
                        
                                2个月前关闭。
            
                    
我正在使用Firebase Firestore保存数据。
  我想检索用户所在的城市,并根据它从Firestore中检索特定数据并设置RecyclerView。
问题是:当我进行查询时,我无法将变量(city)置于OnCompleteListener之外。
在下面的代码中,(setUpRecyclerView())中的(userCity)为“”,并且位于OnCompleteListener之外的任何位置。我能做什么??
这是我的代码:

   public class chosenSubject extends AppCompatActivity {
    private FirebaseAuth mAuth=FirebaseAuth.getInstance();
    private FirebaseUser currentUser= mAuth.getCurrentUser();
    private FirebaseFirestore db = FirebaseFirestore.getInstance();
    private TextView tv;
    private String UserId =currentUser.getUid();

    private TeacherAdapter teacherAdapter;

    private static String userCity="";
    private static String city;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_chosen_subject);
        tv=findViewById(R.id.tv);

        db.collectionGroup("Id").whereEqualTo("id" , UserId).get()
                .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                    @Override
                    public void onComplete(@NonNull Task<QuerySnapshot> task) {
                        if (task.isSuccessful()){
                            for (QueryDocumentSnapshot document : task.getResult()){
                                city = document.getString("city");
                            }
                        }
                        userCity = city;
                    }

                });
        setUpRecyclerView();

    }// end of onCreate


    private void setUpRecyclerView(){

        Query query =   db.collection("Users").document("Teachers").collection("Id")
                .whereEqualTo("city" , userCity);

        FirestoreRecyclerOptions < TeacherOfSubject > options = new FirestoreRecyclerOptions.Builder<TeacherOfSubject>()
                .setQuery(query, TeacherOfSubject.class)
                .build();

        teacherAdapter = new TeacherAdapter(options);

        RecyclerView recyclerView = findViewById(R.id.recycler_view);
        recyclerView.setHasFixedSize(true);    //for performane reasons
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyclerView.setAdapter(teacherAdapter);
    }

    @Override
    protected void onStart() {
        super.onStart();
        teacherAdapter.startListening();
    }

    @Override
    protected void onStop() {
        super.onStop();
        teacherAdapter.stopListening();
    }
}// end of class

最佳答案

不必在onCompleteListener之后调用setUpRecyclerView,而是在onCompleteListener内部调用它,如下所示:

db.collectionGroup("Id").whereEqualTo("id" , UserId).get()
        .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
            @Override
            public void onComplete(@NonNull Task<QuerySnapshot> task) {
                if (task.isSuccessful()){
                    for (QueryDocumentSnapshot document : task.getResult()){
                        city = document.getString("city");
                    }
                }
                userCity = city;
                setUpRecyclerView()
            }

        });


另外,如果您的操作花费一些时间,请考虑预先添加一个ProgressDialog,并在数据库运行查询后将其关闭。

private ProgressDialog progress;
private void showProgress(String message) {
    progress = new ProgressDialog(this);
    progress.setMessage(message);
    progress.setIndeterminate(true);
    progress.show();
}

private void hideProgress() {
    if (progress != null) {
        progress.dismiss();
    }
}


编辑:

private void setUpRecyclerView(){

    Query query =   db.collection("Users").document("Teachers").collection("Id")
            .whereEqualTo("city" , userCity);

    FirestoreRecyclerOptions < TeacherOfSubject > options = new FirestoreRecyclerOptions.Builder<TeacherOfSubject>()
            .setQuery(query, TeacherOfSubject.class)
            .build();

    teacherAdapter = new TeacherAdapter(options);

    RecyclerView recyclerView = findViewById(R.id.recycler_view);
    recyclerView.setHasFixedSize(true);    //for performane reasons
    recyclerView.setLayoutManager(new LinearLayoutManager(this));
    recyclerView.setAdapter(teacherAdapter);
    teacherAdapter.startListening();

}

@Override
protected void onStart() {
    super.onStart();
}

07-24 09:47