J'utilise FireStore de firebase pour la sauvegarde des données. Je veux récupérer la ville de l'utilisateur et selon elle, récupérer des données spécifiques de FireStore et définir les RecyclerView. Le problème est le suivant: quand je fais une requête, je ne peux pas prendre la variable (ville) en dehors du OnCompleteListener. Dans le code ci-dessous (userCity) dans (setUpRecyclerView ()) est "" et aussi à l'extérieur où toute OnCompleteListener. Que puis-je faire?? Voici mon code:
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
Au lieu d'appeler setUpRecyclerView après votre onCompleteListener, appelez dans votre onCompleteListener comme ceci:
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()
}
});
De plus, si vos opérations prennent un certain temps, envisager d'ajouter un ProgressDialog au préalable et de le rejeter après la base de données n'a sa requête.
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();
}
}
ÉDITER:
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();
}