如何使用 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) {
}
});
我正在寻找类似的东西
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) {
}
});