Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android firebase recyclerview适配器中的查询不起作用_Android_Nullpointerexception_Firebase Realtime Database_Android Recyclerview - Fatal编程技术网

Android firebase recyclerview适配器中的查询不起作用

Android firebase recyclerview适配器中的查询不起作用,android,nullpointerexception,firebase-realtime-database,android-recyclerview,Android,Nullpointerexception,Firebase Realtime Database,Android Recyclerview,我正在尝试使用firebase数据库中的数据填充firebase recyclerview中的数据。我正在使用“查询”功能筛选结果,但当我运行应用程序时,我从“查询”中得到一个空指针异常错误,但“查询”在调试中未返回“空”。这是我的密码 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.la

我正在尝试使用firebase数据库中的数据填充firebase recyclerview中的数据。我正在使用“查询”功能筛选结果,但当我运行应用程序时,我从“查询”中得到一个空指针异常错误,但“查询”在调试中未返回“空”。这是我的密码

@Override
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

    setContentView(R.layout.users_list);
    users2 = (RecyclerView) findViewById(R.id.users_list);
    users2.setHasFixedSize(true);
    users2.setLayoutManager(new LinearLayoutManager(this));


    firebaseAuth = FirebaseAuth.getInstance();

        databaseReference = FirebaseDatabase.getInstance().getReference().child("Users");

    final String user_id = firebaseAuth.getCurrentUser().getUid();



    databaseReference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot){

            halls2 = (String) dataSnapshot.child("Male").child(user_id).child("halls").getValue();
            halls1 = (String) dataSnapshot.child("Female").child(user_id).child("halls").getValue();

            if(dataSnapshot.child("Male").hasChild(user_id)){
            }
            else{
                query = databaseReference.child("Male").orderByChild("halls").equalTo(halls1);
            }

        }
        @Override
        public  void onCancelled(DatabaseError databaseError){

        }
    });

    databaseReference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot){


            if(dataSnapshot.child("Male").hasChild(user_id)){

                query = databaseReference.child("Female").orderByChild("halls").equalTo(halls2);


            }
            else{
                query = databaseReference.child("Male").orderByChild("halls").equalTo(halls1);

            }



        }

        @Override
        public  void onCancelled(DatabaseError databaseError){

        }
    });

    FirebaseRecyclerAdapter<User, UserViewholder> firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<User, UserViewholder>(
            User.class, R.layout.users_row, UserViewholder.class, query) {
        @Override
        protected void populateViewHolder(UserViewholder viewHolder, User model, int position) {
            viewHolder.setUsername(model.getUsername());
            viewHolder.setLevels(model.getLevels());
            viewHolder.setDownloadUrl(getApplicationContext(), model.getDownloadUrl());
        }

    };

    users2.setAdapter(firebaseRecyclerAdapter);
错误日志

E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: dev.mintz.loginapp, PID: 3157
                  java.lang.RuntimeException: Unable to start activity ComponentInfo{dev.mintz.loginapp/dev.mintz.loginapp.Users}: java.lang.NullPointerException: Attempt to invoke virtual method 'com.google.firebase.database.ChildEventListener com.google.firebase.database.Query.addChildEventListener(com.google.firebase.database.ChildEventListener)' on a null object reference
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2665)
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726)
                      at android.app.ActivityThread.-wrap12(ActivityThread.java)
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477)
                      at android.os.Handler.dispatchMessage(Handler.java:102)
                      at android.os.Looper.loop(Looper.java:154)
                      at android.app.ActivityThread.main(ActivityThread.java:6119)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
                   Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'com.google.firebase.database.ChildEventListener com.google.firebase.database.Query.addChildEventListener(com.google.firebase.database.ChildEventListener)' on a null object reference
                      at com.firebase.ui.database.FirebaseArray.<init>(FirebaseArray.java:41)
                      at com.firebase.ui.database.FirebaseRecyclerAdapter.<init>(FirebaseRecyclerAdapter.java:91)
                      at dev.mintz.loginapp.Users$2.<init>(Users.java:0)
                      at dev.mintz.loginapp.Users.onCreate(Users.java:108)
                      at android.app.Activity.performCreate(Activity.java:6679)
                      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2618)
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726) 
                      at android.app.ActivityThread.-wrap12(ActivityThread.java) 
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477) 
                      at android.os.Handler.dispatchMessage(Handler.java:102) 
                      at android.os.Looper.loop(Looper.java:154) 
                      at android.app.ActivityThread.main(ActivityThread.java:6119) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) 
E/AndroidRuntime:致命异常:主
进程:dev.mintz.loginapp,PID:3157
java.lang.RuntimeException:无法启动活动组件信息{dev.mintz.loginapp/dev.mintz.loginapp.Users}:java.lang.NullPointerException:尝试调用虚拟方法'com.google.firebase.database.ChildEventListener.com.google.firebase.database.Query.addChildEventListener(com.google.firebase.database.ChildEventListener)'在空对象引用上
在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2665)上
位于android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726)
位于android.app.ActivityThread.-wrap12(ActivityThread.java)
在android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477)上
位于android.os.Handler.dispatchMessage(Handler.java:102)
位于android.os.Looper.loop(Looper.java:154)
位于android.app.ActivityThread.main(ActivityThread.java:6119)
位于java.lang.reflect.Method.invoke(本机方法)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)上
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
原因:java.lang.NullPointerException:尝试对空对象引用调用虚拟方法“com.google.firebase.database.ChildEventListener com.google.firebase.database.database.ChildEventListener.Query.addChildEventListener(com.google.firebase.database.ChildEventListener)”
位于com.firebase.ui.database.FirebaseArray.(FirebaseArray.java:41)
位于com.firebase.ui.database.FirebaseRecyclerAdapter。(FirebaseRecyclerAdapter.java:91)
位于dev.mintz.loginapp.Users$2。(Users.java:0)
位于dev.mintz.loginapp.Users.onCreate(Users.java:108)
位于android.app.Activity.performCreate(Activity.java:6679)
位于android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2618)上
位于android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726)
位于android.app.ActivityThread.-wrap12(ActivityThread.java)
在android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477)上
位于android.os.Handler.dispatchMessage(Handler.java:102)
位于android.os.Looper.loop(Looper.java:154)
位于android.app.ActivityThread.main(ActivityThread.java:6119)
位于java.lang.reflect.Method.invoke(本机方法)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)上
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

您的
新FirebaseRecyclerAdapter
方法最好紧跟在
users2.setLayoutManager
之后

仅仅因为在某些代码行之间有
query=
代码,根本不表示它运行的时间,特别是因为Firebase是异步的

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.users_list);

    firebaseAuth = FirebaseAuth.getInstance();

    databaseReference = FirebaseDatabase.getInstance().getReference().child("Users");

    users2 = (RecyclerView) findViewById(R.id.users_list);
    users2.setHasFixedSize(true);
    users2.setLayoutManager(new LinearLayoutManager(this));

    // query = ... ; // Set this to literally anything but 'null'

    // Otherwise, your error is here...
    final FirebaseRecyclerAdapter<User, UserViewholder> firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<User, UserViewholder>(
            User.class, R.layout.users_row, UserViewholder.class, query) {
        @Override
        protected void populateViewHolder(UserViewholder viewHolder, User model, int position) {
            viewHolder.setUsername(model.getUsername());
            viewHolder.setLevels(model.getLevels());
            viewHolder.setDownloadUrl(getApplicationContext(), model.getDownloadUrl());
        }

    };

    users2.setAdapter(firebaseRecyclerAdapter);

    // The rest of your code
    databaseReference.addValueEventListener(new ValueEventListener() {
        ...

创建适配器时,查询为空。在Firebase返回数据之前不会分配它。ohk!请问,在firebase返回数据之前,我是否可以查询@cricket_007;您只需将
query
初始化为除null以外的任何值。但仅仅因为您在结果中重新分配了
query
,您的适配器将不会精确地更改。您的
新FirebaseRecyclerAdapter
方法也可能紧跟在
users2.setLayoutManager
之后。仅仅因为
query=
位于这些代码行之间,并不表示它何时运行。
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.users_list);

    firebaseAuth = FirebaseAuth.getInstance();

    databaseReference = FirebaseDatabase.getInstance().getReference().child("Users");

    users2 = (RecyclerView) findViewById(R.id.users_list);
    users2.setHasFixedSize(true);
    users2.setLayoutManager(new LinearLayoutManager(this));

    // query = ... ; // Set this to literally anything but 'null'

    // Otherwise, your error is here...
    final FirebaseRecyclerAdapter<User, UserViewholder> firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<User, UserViewholder>(
            User.class, R.layout.users_row, UserViewholder.class, query) {
        @Override
        protected void populateViewHolder(UserViewholder viewHolder, User model, int position) {
            viewHolder.setUsername(model.getUsername());
            viewHolder.setLevels(model.getLevels());
            viewHolder.setDownloadUrl(getApplicationContext(), model.getDownloadUrl());
        }

    };

    users2.setAdapter(firebaseRecyclerAdapter);

    // The rest of your code
    databaseReference.addValueEventListener(new ValueEventListener() {
        ...
public void onDataChange(...) {
    ...

    query = ... ; // Update query
    firebaseRecyclerAdapter.notifyDataSetChanged(); // Update UI
}