Поиск в Firebase Null с помощью прослушивателя onClick

#android #firebase-realtime-database #nullpointerexception

#Android #firebase-база данных в реальном времени #исключение nullpointerexception

Вопрос:

Я пытаюсь выполнить поиск информации в моей базе данных 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.Запрос.addChildEventListener (com.google.firebase.database.ChildEventListener)’ по ссылке на нулевой объект

Любая помощь относительно того, почему это значение равно null, была бы весьма признательна!

Комментарии:

1. Значение query равно null и выдает это исключение. Согласно исходному коду, запрос назначается только после щелчка по imgB .

2. Я это понимаю. Но я хочу иметь возможность искать что-то в этом запросе после нажатия кнопки ImageButton

Ответ №1:

Чтобы иметь возможность инициализировать адаптер, у вас должен быть действительный запрос. И чтобы иметь возможность создать запрос, вам необходимо иметь 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);
    }
});
  

Комментарии:

1. Теперь я получаю исключение NullPointerException в моем методе OnStart (), когда я указываю activity начать прослушивание FirebaseRecyclerAdapter

2. Ну да, это имело бы смысл, если бы вы вызывали startListening адаптер, который еще не был создан. Вероятно, вам следует переместить этот вызов в конец onClick .

3. Да, я это исправил 🙂