如何使用 Filterable 类过滤 Firebase 实时数据库结果

Posted

技术标签:

【中文标题】如何使用 Filterable 类过滤 Firebase 实时数据库结果【英文标题】:How to filter firebase realtime database results by using Filterable class 【发布时间】:2020-08-29 11:57:46 【问题描述】:

我正在寻找类似的东西

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 ...

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

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

【问题讨论】:

您能在这里解释一下您的用例吗?请添加更多详细信息。 如果您考虑在某个时间点尝试使用Cloud Firestore,您可以在此处找到article on how you can filter data。 【参考方案1】:

您应该使用 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) 

        
    ); 

【讨论】:

你的回答给了我解决问题的思路,谢谢

以上是关于如何使用 Filterable 类过滤 Firebase 实时数据库结果的主要内容,如果未能解决你的问题,请参考以下文章

JQM Filterable Widget:如何在离开页面时清除?

如何更改 kendo ui grid mvc 中的默认过滤器运算符

在 Array Adapter 中实现 Filterable 不会过滤任何结果 - 与过滤前相同的列表

Android API之android.widget.Filterable

Android - 使用 Groupie 库过滤列表

iview使用select封装的组件添加filterable属性有空格