どのように私は、クエリOnCompleteListener(変数がOnCreate関数の外部で定義される)の外に、この変数を使用できますか?

サルマ・工学:

私は、データを保存するための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();
}

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=362223&siteId=1