首页 > 解决方案 > 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

编辑解决:在设置适配器之前将数据库代码移动到,并使变量公开和静态以从适配器类访问它们。

标签: androidfirebasefirebase-realtime-database

解决方案


为了解决这个问题,只需要以下几行代码:

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 个不同的列表。


推荐阅读