如何使用 Filterable class 过滤 firebase 实时数据库结果

How to filter firebase realtime database results by using Filterable class

我正在寻找类似的东西

ArrayList<Model> models = new ArrayList();

mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener(){
@Override
public boolena onQueryTextSubmit(String str){

    mDbReference.child("mp_path").addChildEventListener(new ChildEventListener(){
        @Override 
        public void onChildAdded(DataSnapshot ds){
             Model model = ds.getValue(Model.class);
             models.add(model);
             mAdapter.notifyDataSetChanged();
             mAdapter.getFilter().filter(str.toLowerCase());
        }

        Other methods...

    });



}

@Override
public boolean onQueryTextChanged(String str){
return false;
}

});

我在数据库中有值

-users
    -user1
         -name: "example"
         -surname: "example"
    -user2
    -user3 ...

该应用的用户会遇到空白屏幕。然后 he/she 将点击搜索按钮,写入一个字符串,然后提交查询。当 he/she 按回车键搜索时,上面的代码将起作用,程序将从数据库中检索所有用户。检索后,一些过滤方法将是 运行(例如,如果客户搜索 userx,则显示 userx & user(x-1) & user(x+1)。)消除应该在检索数据后起作用。

这里的问题是每当 addChildEventListener 方法工作时,它会迭代 onChildAdded 方法中的代码。问题源于 firebase 数据库是异步的。我想在将每个值添加到我的模型列表后过滤结果。不幸的是,如果我在数据库方法之外编写过滤器方法,程序不会等到 firebase 方法完成并且应用程序崩溃。我不想使用 firebase 查询方法,因为我使用了多个复杂的过滤器。我在网上搜索了解决方案,但找不到解决问题的方法。

您应该使用 addListenerForSingleValueEvent。 不是 addChildEventListener.

    mDbReference.child("mp_path").addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            models.clear();
            for(DataSnapshot ds : dataSnapshot.getChildren()) {
                Model model = ds.getValue(Model.class);
                models.add(model);
            }
            mAdapter.notifyDataSetChanged();
            mAdapter.getFilter().filter(str.toLowerCase());
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });