如何使用 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 不会过滤任何结果 - 与过滤前相同的列表