サルマ・工学:
私は、データを保存するためのfirebase firestoreを使用しています。私は、ユーザーの街を取得し、それに応じて、firestoreから特定のデータを取得し、RecyclerViewを設定したいです。問題がある:私は、クエリを作るとき、私は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
KoalaKoalified:
代わりにあなたの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();
}
}
EDIT:
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();
}