Android 如何使用SearchView工具栏筛选数据库Firebase

Android 如何使用SearchView工具栏筛选数据库Firebase,android,firebase-realtime-database,Android,Firebase Realtime Database,我想实现一个searchview,根据用户输入过滤firebase数据库中的数据,但当我这样尝试时,结果不会显示为没有更新数据 我试图寻找一些答案,并尝试了一下,但没有成功 这是我的密码 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the la

我想实现一个searchview,根据用户输入过滤firebase数据库中的数据,但当我这样尝试时,结果不会显示为没有更新数据

我试图寻找一些答案,并尝试了一下,但没有成功

这是我的密码

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    view = inflater.inflate(R.layout.fragment_resep, container, false);

    initFirebase();
    initRecylerView(view);
    setData();
    return view;

}

@Override
public void onPrepareOptionsMenu(Menu menu) {
    super.onPrepareOptionsMenu(menu);
    MenuItem mSearchMenuItem = menu.findItem(R.id.action_search);
    searchView = (SearchView) mSearchMenuItem.getActionView();
    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String query) {
            Toast.makeText(context,query,Toast.LENGTH_LONG).show();
            searcDataFirebase(query);
            return false;
        }

        @Override
        public boolean onQueryTextChange(String query) {
            return false;
        }
    });
}

private void initFirebase(){
    database = FirebaseDatabase.getInstance();
    reference = database.getReference().child("jamu");

    reference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for (DataSnapshot postSnapshot: dataSnapshot.getChildren()) {

                //instance object to get data
                model = postSnapshot.getValue(ModelResep.class);
//                    Log.e("DATA ",model.getBahan()+model.getNama()+model.getKhasiat()+model.getLinkGambar()+model.getPembuatan());

            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
}

private void searcDataFirebase(final String search){
    database = FirebaseDatabase.getInstance();
    reference = database.getReference();

    Query query = reference.child("jamu").orderByChild("NamaJamu").equalTo(search);
    query.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for (DataSnapshot postSnapshot: dataSnapshot.getChildren()) {

                //instance object to get data
                 model = postSnapshot.getValue(ModelResep.class);
//                    Log.e("DATA ",model.getBahan()+model.getNamaJamu()+model.getKhasiat()+model.getLinkGambar()+model.getPembuatan());

            }

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

}

private void initRecylerView(View view){
    recyclerView = (RecyclerView)view.findViewById(R.id.rv_resep);
    recyclerView.setHasFixedSize(true);
    LinearLayoutManager layoutManager = new LinearLayoutManager(context);
    layoutManager.setReverseLayout(true);
    layoutManager.setStackFromEnd(true);
    recyclerView.setLayoutManager(layoutManager);
}

private void setData(){
    //instace object from lib firebase ui and set data
    adapter = new FirebaseRecyclerAdapter<ModelResep, AdapterResep>(

            ModelResep.class,
            R.layout.rows_jamu,
            AdapterResep.class,
            reference
    ) {
        @Override
        protected void populateViewHolder(AdapterResep viewHolder, final ModelResep model, int position) {

            //get id from click position
            final String id = getRef(position).getKey();

            //set data adapter from model
            viewHolder.setNama(model.getNamaJamu());
            viewHolder.setImage(context,model.getLinkGambar());

            //click listener for update data
            viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(context,DetailResepActivity.class);
                    intent.putExtra("id",id);
                    intent.putExtra("NamaJamu",model.getNamaJamu());
                    intent.putExtra("Bahan",model.getBahan());
                    intent.putExtra("Khasiat",model.getKhasiat());
                    intent.putExtra("LinkGambar",model.getLinkGambar());
                    intent.putExtra("Pembuatan",model.getPembuatan());
                    startActivity(intent);
                }
            });

        }
    };

    //set data adapter
    recyclerView.setAdapter(adapter);

}
@覆盖
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
//为该碎片膨胀布局
视图=充气机。充气(R.layout.fragment_resep,容器,假);
initFirebase();
初始视图(视图);
setData();
返回视图;
}
@凌驾
在PrepareOptions功能表(菜单)上公共作废{
super.onPrepareOptions菜单(菜单);
MenuItem mSearchMenuItem=menu.findItem(R.id.action\u search);
searchView=(searchView)mSearchMenuItem.getActionView();
searchView.setOnQueryTextListener(新的searchView.OnQueryTextListener(){
@凌驾
公共布尔值onQueryTextSubmit(字符串查询){
Toast.makeText(上下文、查询、Toast.LENGTH_LONG).show();
firebase(查询);
返回false;
}
@凌驾
公共布尔onQueryTextChange(字符串查询){
返回false;
}
});
}
私有void initFirebase(){
database=FirebaseDatabase.getInstance();
reference=database.getReference().child(“jamu”);
addValueEventListener(新的ValueEventListener(){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
对于(DataSnapshot postSnapshot:DataSnapshot.getChildren()){
//获取数据的实例对象
model=postSnapshot.getValue(ModelResep.class);
//Log.e(“数据”,model.getBahan()+model.getNama()+model.getKhasiat()+model.getLinkGambar()+model.getPembuatan());
}
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
}
});
}
private void Firebase(最终字符串搜索){
database=FirebaseDatabase.getInstance();
reference=database.getReference();
查询=reference.child(“jamu”).orderByChild(“NamaJamu”).equalTo(搜索);
query.addListenerForSingleValueEvent(新的ValueEventListener()){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
对于(DataSnapshot postSnapshot:DataSnapshot.getChildren()){
//获取数据的实例对象
model=postSnapshot.getValue(ModelResep.class);
//Log.e(“数据”,model.getBahan()+model.getNamaJamu()+model.getKhasiat()+model.getLinkGambar()+model.getPembuatan());
}
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
}
});
}
私有void initRecylerView(视图){
recyclerView=(recyclerView)view.findViewById(R.id.rv_resep);
recyclerView.setHasFixedSize(true);
LinearLayoutManager layoutManager=新的LinearLayoutManager(上下文);
layoutManager.setReverseLayout(true);
layoutManager.setStackFromEnd(true);
recyclerView.setLayoutManager(layoutManager);
}
私有void setData(){
//lib firebase ui中的instace对象和设置数据
适配器=新的FirebaseRecyclerAdapter(
ModelResep.class,
R.layout.rows_jamu,
AdapterResep.class,
参考
) {
@凌驾
受保护的void populateViewHolder(AdapterResep viewHolder,最终模型Resep模型,内部位置){
//从单击位置获取id
最终字符串id=getRef(位置).getKey();
//从模型设置数据适配器
setNama(model.getNamaJamu());
setImage(上下文,model.getLinkGambar());
//单击侦听器以更新数据
viewHolder.itemView.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
意向意向=新意向(上下文,DetailResepActivity.class);
意向。额外(“id”,id);
intent.putExtra(“NamaJamu”,model.getNamaJamu());
intent.putExtra(“Bahan”,model.getBahan());
intent.putExtra(“Khasiat”,model.getKhasiat());
intent.putExtra(“linkgabar”,model.getlinkgabar());
intent.putExtra(“Pembuatan”,model.getPembuatan());
星触觉(意向);
}
});
}
};
//设置数据适配器
recyclerView.setAdapter(适配器);
}

您不需要在任何数组中创建新方法“firebaseUserSearch” 复制您的RecyclerView适配器并粘贴到内部。使用databaseReference对其进行筛选

我的结构是:

 BLABLA:
     Bars:
         01: 
            BarName: "Best bar"
         02:
            BarName: "The Worst bar"
代码如下:

  ....

    databaseReference = FirebaseDatabase.getInstance().getReference ("Bars");

  .....


  searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String searchText) {

            // TODO Auto-generated method stub

            return false;
        }

        @Override
        public boolean onQueryTextChange(String searchText) {

            searchText = searchView.getQuery().toString();

            firebaseUserSearch (searchText);

            return true;
        }
    });
    return true;
}



private void firebaseUserSearch (final String searchText) {


    firebaseRecyclerAdapter = new FirebaseRecyclerAdapter <Bar, ViewHolder>(

            Bar.class,
            R.layout.custom_row,
            ViewHolder.class,
       databaseReference.orderByChild("barName").startAt(searchText.toUpperCase()).endAt(searchText + "\uf8ff"))
    {
        @Override
        protected void populateViewHolder(ViewHolder viewHolder, Bar model, final int position) {

  ....
。。。。
databaseReference=FirebaseDatabase.getInstance().getReference(“条”);
.....
searchView.setOnQueryTextListener(新的searchView.OnQueryTextListener(){
@凌驾
公共布尔值onQueryTextSubmit(字符串搜索文本){
//TODO自动生成的方法存根
返回false;
}
@凌驾
公共布尔值onQueryTextChange(字符串搜索文本){
searchText=searchView.getQuery().toString();
firebaseUserSearch(searchText);
返回true;
}
});
返回true;
}
私有void firebaseUserSearch(最终字符串搜索文本){
firebaseRecyclerAdapter=新的firebaseRecyclerAdapter(
酒吧,
R.layout.custom_行,
ViewHolder.class,
databaseReference.orderByChild(“barName”).startAt(searchText.toUpperCase()).endAt(searchText+“\uf8ff”))
{
@凌驾
受保护的void populateViewHolder(ViewHolder ViewHolder、条形图模型、最终int位置){
....

虽然这个代码片段可以解决这个问题,但它确实有助于