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之外的任何位置。我能做什么??
这是我的代码:
另外,如果您的操作花费一些时间,请考虑预先添加一个ProgressDialog,并在数据库运行查询后将其关闭。
编辑:
(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