【问题标题】:Non static method 'getUid()' cannot be reference from a static context不能从静态上下文引用非静态方法“getUid()”
【发布时间】:2021-07-30 00:12:26
【问题描述】:

我正在创建一个 recyclerview,它显示活动中的所有用户列表。我想获取除当前登录用户之外的所有用户。

我试过这个:

 final FirebaseUser firebaseUser = FirebaseAuth.getInstance().getCurrentUser();
        // get path of database name "Users" containing users info
        DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("Users");
        //get all data from path
        databaseReference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                usersList.clear();
                for(DataSnapshot dataSnapshot1: dataSnapshot.getChildren()) {
                    ModelUsers modelUsers = dataSnapshot1.getValue(ModelUsers.class);
                    usersList.add(modelUsers);
                    // get all users except currently signed in user
                   if (!ModelUsers.getUid().equals(firebaseUser.getUid())) {
                        usersList.add(modelUsers);
                    }
                }
                adapterUser.notifyDataSetChanged();
            }

但是当我添加时我得到Non static method 'getUid()' cannot be reference from a static context

if (!ModelUsers.getUid().equals(firebaseUser.getUid())) {
                            usersList.add(modelUsers);
                        }

问题是,如果我将其设为静态,则会在列表数据中出现错误。 有没有办法解决这个问题?请帮忙。

【问题讨论】:

    标签: android firebase-realtime-database android-recyclerview


    【解决方案1】:

    您似乎打算使用带有小写 m 的 modelUsers.getUid() 来引用您刚刚在上面几行中创建的对象。

    【讨论】:

    • 我做到了,问题消失了,但是当我构建项目时,我收到了这个错误:java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java. lang.Object)' 在 com.example.schoolteacher.AllUsersActivity$1.onDataChange(AllUsersActivity.java:107) 处的空对象引用上
    • 听起来您遇到了一个与第一个不同的新问题。我建议学习如何调试你的代码,这样你就可以追踪这些类型的错误。
    【解决方案2】:

    问题在这里:

     if (!ModelUsers.getUid().equals(firebaseUser.getUid())) {
                        usersList.add(modelUsers);
     }
    

    您正在使用类直接调用getUid() 方法,使用类的对象调用它。还要检查 Uid 是否为空:

    if (modelUsers.getUid() != null && !modelUsers.getUid().equals(firebaseUser.getUid())) {
        usersList.add(modelUsers);
    }
    

    PS:

    在您的函数注释中usersList.add(modelUsers); 并检查 todo。将您的功能更新为:

    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        usersList.clear();
    
        //TODO CHECK HERE HOW MANY dataSnapshot OBJECTS ARE YOU GETTING
    
        for(DataSnapshot dataSnapshot1: dataSnapshot.getChildren()) {
            ModelUsers modelUsers = dataSnapshot1.getValue(ModelUsers.class);
            //usersList.add(modelUsers);
            // get all users except currently signed in user
            if (modelUsers.getUid() != null && !modelUsers.getUid().equals(firebaseUser.getUid())) {
                usersList.add(modelUsers);
            }
        }
          adapterUser.swapData(userList);
        //adapterUser.notifyDataSetChanged();
    }
    

    在您的适配器类中添加此方法(将变量名称和数据类型更新为您的):

    public void swapData(ArrayList<ModelUsers> list) {
        if (list != null) {
            this.arrayList.clear();
            this.arrayList.addAll(list);
            notifyDataSetChanged();
        }
    }
    

    【讨论】:

    • 我收到此错误:java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on an null object reference at com.example .schoolteacher.AllUsersActivity$1.onDataChange(AllUsersActivity.java:107)
    • 我在这一行得到错误:if (!modelUsers.getUid().equals(firebaseUser.getUid())) {
    • 检查我的答案中的新编辑,您可能会得到 Uid 对象的空值
    • 谢谢!我不再收到错误消息,但我仍然在 recyclerview 中获得当前登录的用户
    • @xLogger 你有没有调试并检查你在回调中有多少用户?/
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-22
    • 2023-03-31
    • 2013-04-05
    相关资源
    最近更新 更多