首页 > 解决方案 > 使用 onClick 侦听器在 Firebase Null 中搜索

问题描述

我正在尝试在我的 firebase 数据库中搜索信息,但我无法这样做。

这是我从中搜索的课程:

private FirebaseRecyclerAdapter<DjProfile, ResultsViewHolder> firebaseRecyclerAdapter;
    public static Query query;

    public static String searchData;
    DatabaseReference mProfileDatabase;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_attendee_landing);
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);


        final RecyclerView recyclerView = findViewById(R.id.results_recycler);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));

        final EditText t = (EditText) findViewById(R.id.DjNameET);

        mProfileDatabase = FirebaseDatabase.getInstance().getReference();

        t.setOnEditorActionListener(new TextView.OnEditorActionListener() {
            @Override
            public boolean onEditorAction(TextView textView, int i, KeyEvent keyEvent) {
                if(i == EditorInfo.IME_ACTION_SEARCH)
                {
                    searchData = t.getText().toString();


                    return true;
                }
                return false;
            }
        });

        ImageButton imgB= (ImageButton) findViewById(R.id.searchBtn);

        imgB.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View view)
            {
               query = mProfileDatabase.orderByChild("djprofile")
                        .startAt(searchData)
                        .endAt(searchData + "\uf8ff");


            }
        });
        FirebaseRecyclerOptions<DjProfile> firebaseRecyclerOptions = new FirebaseRecyclerOptions.Builder<DjProfile>()
                .setQuery(query, DjProfile.class)
                .build();
        firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<DjProfile, ResultsViewHolder>(firebaseRecyclerOptions)
        {

            @NonNull
            @Override
            public ResultsViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
                View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.searchitem_list, viewGroup, false);

                return new ResultsViewHolder(view);
            }

            @Override
            protected void onBindViewHolder(@NonNull ResultsViewHolder holder, int position, @NonNull DjProfile model) {
                holder.setDjProfile(model);
            }
        };
        recyclerView.setAdapter(firebaseRecyclerAdapter);


    }

    @Override
    protected void onStart()
    {
        super.onStart();
        firebaseRecyclerAdapter.startListening();
    }

这是我得到的异常:(说发生在 onStart() 方法中)

java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法 'com.google.firebase.database.ChildEventListener com.google.firebase.database.Query.addChildEventListener(com.google.firebase.database.ChildEventListener)'

任何关于为什么这是 null 的帮助将不胜感激!

标签: androidfirebase-realtime-databasenullpointerexception

解决方案


为了能够初始化适配器,您需要有一个有效的查询。为了能够创建查询,您需要拥有searchData. 这意味着 的初始化firebaseRecyclerAdapter应该发生在onClick.

imgB.setOnClickListener(new View.OnClickListener(){

    @Override
    public void onClick(View view)
    {
       query = mProfileDatabase.orderByChild("djprofile")
                .startAt(searchData)
                .endAt(searchData + "\uf8ff");

        FirebaseRecyclerOptions<DjProfile> firebaseRecyclerOptions = new FirebaseRecyclerOptions.Builder<DjProfile>()
                .setQuery(query, DjProfile.class)
                .build();
        firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<DjProfile, ResultsViewHolder>(firebaseRecyclerOptions)
        {

            @NonNull
            @Override
            public ResultsViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
                View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.searchitem_list, viewGroup, false);

                return new ResultsViewHolder(view);
            }

            @Override
            protected void onBindViewHolder(@NonNull ResultsViewHolder holder, int position, @NonNull DjProfile model) {
                holder.setDjProfile(model);
            }
        };
        recyclerView.setAdapter(firebaseRecyclerAdapter);
    }
});

推荐阅读