Firebase调用onChildAdded两次。

5

我正在SearchTextView OnQueryListener中调用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);}
1个回答

2
每次与您的查询匹配的子节点都将调用onChildAdded。但请注意,每次用户提交搜索文本时,您都会添加一个新的子监听器。因此,如果他们提交两次,则会有两个监听器,并且每个子项都会调用onChildAdded两次(每个监听器一次)。然后再次提交搜索时,它将添加第三个监听器。依此类推。
解决方案是在附加新监听器之前分离先前的监听器。请参阅分离侦听器的文档。或者使用此处提供的代码作为灵感:如何停止在Android中监听Firebase位置

1
尝试了您的解决方案@Frank van Puffelen,但没有成功,Firebase监听器仅返回两次而不是更多,这是分离监听器的代码:if(dataSnapshot!=null){student=dataSnapshot.getValue(Student.class);Log.d("check",student.getName());mDatabaseReference.removeEventListener(this);} - NightOwl
在最后一次调用中,this 没有意义。在我提供的第二个链接中,您可以看到如何保留对侦听器的引用,然后使用该引用取消注册。 - Frank van Puffelen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接