#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. Да, я это исправил 🙂