Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/221.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用Filterable类过滤firebase实时数据库结果_Java_Android_Firebase_Firebase Realtime Database_Android Filterable - Fatal编程技术网

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) {

        }
    });