我正在使用Firebase fiRecovery来保存数据。我想检索用户所在的城市,并根据它,从firest中检索特定数据并设置RecyclView。问题是:当我进行查询时,我不能在OnCompleteListener之外获取变量(城市)。在(setUpRecyclView())中(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
当数据准备好时,只需将您的var传递给setUpRecyclView方法
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");
}
}
setUpRecyclerView(city);
}
});
你的方法是这样的
private void setUpRecyclerView(String city){
Query query = db.collection("Users").document("Teachers").collection("Id")
.whereEqualTo("city" , city);
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);
}
不要在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();
}
我正在尝试理解下面的QuickSort实现在Java中是如何工作的。我已经了解了大部分,但我很困惑它是如何做任何事情的。当您将变量传递给函数并对其进行修改时,它通常不会修改传入的原始变量。那么为什么这种没有返回类型的快速排序实现会修改传入的数组呢?
本文向大家介绍docker如何在外部指定参数变量,包括了docker如何在外部指定参数变量的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了docker如何在外部指定参数变量,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Dockerfile: 配置中给与变量:application.properties 用于Test: 运行镜像 :
我订阅了一个方法中的一个可观察的,需要在另一个方法中取消订阅。从一个初始化函数调用子计数器()方法,其内容工作正常。 当我调用我的touchActivate()函数时,它包含一个对存储的变量的unsubscribe函数,但是它会抛出一个错误,因为未定义。控制台日志记录返回一个未定义的对象。 在类的顶部,我定义了一个变量:
问题内容: 我正在尝试使用Firebase设置CollectionView中的单元格数量。我试图创建一个局部变量,并将其设置为与Firebase变量相同的值,但是当我尝试在函数外部使用它时,它将无法正常工作。我也尝试在ViewWillAppear中设置它,但是没有用。 我设置导航栏标题以查看值。当它在闭包中设置时,我得到了正确的值,当我在闭包外部(在firebase函数之后)写了它时,它的值为0。
我试图弄清楚如何从函数的外部获取变量,在jQuery的函数内部获取变量,但我得到的是。有什么办法可以做到这一点吗? 我的代码的一个简单示例: 但当我在函数外定义变量时,它起作用: 为什么? 感谢任何帮助!谢谢!
问题内容: function parts($part) { $structure = ‘http://’ . $site_url . ‘content/’; echo($tructure . $part . ‘.php’); } 该函数使用在页面顶部定义的变量,但是此变量未传递到该函数中。 我们如何使它返回到函数中? 问题答案: 添加第二个参数 您需要将其他参数传递给函数: 如果关闭 如果您希望使