【问题标题】:How to filter firebase realtime database results by using Filterable class如何使用 Filterable 类过滤 Firebase 实时数据库结果
【发布时间】: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 查询方法,因为我使用了多个复杂的过滤器。我在网上搜索解决方案,但找不到解决问题的方法。

【问题讨论】:

标签: java android firebase firebase-realtime-database android-filterable


【解决方案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) {

        }
    }); 

【讨论】:

  • 你的回答给了我解决问题的思路,谢谢
猜你喜欢
  • 2018-04-24
  • 2020-07-19
  • 2022-06-10
  • 1970-01-01
  • 1970-01-01
  • 2018-06-10
  • 2016-03-24
  • 2018-10-13
相关资源
最近更新 更多