Java 如何使用Filterable类过滤firebase实时数据库结果
我在找这样的东西Java 如何使用Filterable类过滤firebase实时数据库结果,java,android,firebase,firebase-realtime-database,android-filterable,Java,Android,Firebase,Firebase Realtime Database,Android Filterable,我在找这样的东西 ArrayList<Model> models = new ArrayList(); mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener(){ @Override public boolena onQueryTextSubmit(String str){ mDbReference.child("mp_path").addChildEventListener(new C
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;
}
});
应用程序的用户将遇到一个空屏幕。然后他/她会点击搜索按钮,写一个字符串,然后提交查询。当他/她按enter键搜索时,上面的代码将起作用,程序将从数据库检索所有用户。检索后,将运行一些筛选方法(例如,如果客户搜索userx,则显示userx&user(x-1)&user(x+1))。在检索数据后,应该可以进行筛选
这里的问题是,每当addChildEventListener方法起作用时,它就会迭代onChildaded方法中的代码。该问题源于firebase数据库是异步的。我想在每个值添加到我的模型列表后过滤结果。不幸的是,如果我在数据库方法之外编写filter方法,程序不会等到firebase方法完成,应用程序就会崩溃。我不想使用firebase查询方法,因为我使用了多个复杂的过滤器。我在网上寻找解决办法,但找不到解决问题的办法 您应该为SingleValueEvent使用addListenerForSingleValueEvent。 不添加ChildEventListener
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) {
}
});
你能在这里解释一下你的用例吗?如果你考虑在某个时间点尝试使用,在这里你可以找到一个。你的答案给了我一个解决问题的想法,谢谢。
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) {
}
});