android - Firebase 查询等待单值事件监听器
问题描述
我正在尝试从中获取数据firebase
以更新适配器中的内容。我需要等待它异步加载结果,但onDataChange
永远不会被调用。我正在使用以下代码:
class AttendanceAdapter extends PagerAdapter implements View.OnTouchListener {
private loginInfo_Collector mUserInfoCollector;
private FirebaseDatabase mDatabase;
private DatabaseReference mUsersInfoRef;
private DatabaseReference mUser_dataAttRef;
AttendanceAdapter(Context context){
this.context = context;
}
@Override
public int getCount() {
if(mRollDisplayList.isEmpty()) {
loadDatabase();
getCount();
}
return mRollDisplayList.size();
}
private void loadDatabase(){
mDatabase = FirebaseDatabase.getInstance();
mUsersInfoRef = mDatabase.getReference()
.child(AttendanceActivity.mFacultyI)
.child(AttendanceActivity.mYearI)
.child("users");
setViewContentsFromDb();
}
private void setViewContentsFromDb(){
mUsersInfoRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if (mRollList.isEmpty()) {
for (DataSnapshot users : dataSnapshot.getChildren()) {
uIdList.add(users.getKey());
mUserInfoCollector = users.getValue(loginInfo_Collector.class);
mNameList.add(mUserInfoCollector.getName());
mRollList.add(mUserInfoCollector.getRoll_no());
mPhotoUriList.add(Uri.parse(mUserInfoCollector.getPhoto_url()));
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
我尝试使用 while 条件为列表不为空,否则保持空循环但列表永远不会更新。有没有办法在返回结果之前等待查询完成?
数据库结构: 1
编辑解决:在设置适配器之前将数据库代码移动到,并使变量公开和静态以从适配器类访问它们。
解决方案
为了解决这个问题,只需要以下几行代码:
String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference usersRef = rootRef.child("BCT/2072/notice_node/users");
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
List<String> mNameList = new ArrayList<>();
List<String> mRollList = new ArrayList<>();
List<String> mPhotoUriList = new ArrayList<>();
for(DataSnapshot ds : dataSnapshot.getChildren()) {
loginInfo_Collector mUserInfoCollector = users.getValue(loginInfo_Collector.class);
mNameList.add(mUserInfoCollector.getName());
mRollList.add(mUserInfoCollector.getRoll_no());
mPhotoUriList.add(Uri.parse(mUserInfoCollector.getPhoto_url()));
Log.d("TAG", mUserInfoCollector.getName());
}
}
@Override
public void onCancelled(DatabaseError databaseError) {}
};
usersRef.addListenerForSingleValueEvent(valueEventListener);
控制台中的输出将是所有用户的名称。
请注意,更优雅的方法是只创建一个List<loginInfo_Collector>
并在其中添加类型的对象,loginInfo_Collector
而不是像您那样创建 3 个不同的列表。