我在SearchTextView OnQueryListener内部调用OnChildAdded方法,该方法使用OnChildAdded方法在Dialog中搜索和显示记录。但是,当我运行代码时,OnChildAdded方法似乎两次调用内部代码,而对话框提示两次,并且日志语句也是如此。

这是方法的代码:

searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
  mSearchQuery = query.trim();
  mDatabaseReference.orderByChild("name").startAt(mSearchQuery).addChildEventListener(new ChildEventListener() {
    @Override
      public void onChildAdded(DataSnapshot dataSnapshot, String s) {

        student = dataSnapshot.getValue(Student.class);
        FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
        EnrollOperationFragment enrollOperationFragment =  EnrollOperationFragment.newInstance(student.getName(),student.getId());
        enrollOperationFragment.show(fragmentManager,ENROLL_OPERATION);}

最佳答案

将为与您的查询匹配的每个子节点调用onChildAdded。但也请注意,每次用户提交搜索文本时,您都将添加一个新的子监听器。因此,如果他们提交两次,则您有两个监听器,并且每个 child 的onChildAdded将被调用两次(每个监听器一次)。然后,当他们再次提交搜索时,它将添加第三个监听器。等等。

解决方案是在附加新的监听器之前先分离先前的监听器。参见documentation for detaching listeners。或使用她的代码作为灵感:How stop Listening to firebase location in android

关于android - Firebase调用了onChildAdded两次,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42729163/

10-10 15:53