Firebase RecyclerView集成SearchView后搜索时列表为空问题求助
解决SearchView过滤Firebase数据时RecyclerView空白的问题
我看了你的代码,发现两个关键问题导致了这个现象,咱们一步步来修复:
1. 数据库查询路径错误
在search方法里,你已经在onCreate中将mDatabase初始化为FirebaseDatabase.getInstance().getReference().child("Reference"),但构建查询时又额外加了.child("Reference"),这就导致查询路径变成了Reference/Reference——Firebase找不到对应的数据,自然RecyclerView就显示为空了。
2. FirebaseRecyclerAdapter未启动数据监听
FirebaseRecyclerAdapter需要调用startListening()方法才能开始从数据库拉取数据,同时在替换新adapter前,要停止旧adapter的监听,避免内存泄漏和数据冲突。
修正后的search方法
private void search(String searchText) { // 直接用已初始化的mDatabase,不要再叠加child("Reference") Query newQuery = mDatabase.orderByChild("type") .startAt(searchText) .endAt(searchText + "\uf8ff"); FirebaseRecyclerOptions<New> newOptions = new FirebaseRecyclerOptions.Builder<New>() .setQuery(newQuery, New.class) .build(); // 停止旧adapter的监听,避免内存泄漏 if (firebaseRecyclerAdapter != null) { firebaseRecyclerAdapter.stopListening(); } firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<New, ViewHolder>(newOptions) { @Override protected void onBindViewHolder(@NonNull ViewHolder viewHolder, int position, @NonNull New model) { viewHolder.setTitle(model.getType().toString()); viewHolder.setImage(model.getUri(), getApplicationContext()); viewHolder.setLocation(getApplicationContext(), model.getLongitude(), model.getLatitude()); viewHolder.setDate(model.getTime()); viewHolder.setBrief(model.getBrief()); } @NonNull @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = LayoutInflater.from(Display.this).inflate(R.layout.sighting_rows, parent, false); return new ViewHolder(view); } }; // 启动新adapter的数据监听 firebaseRecyclerAdapter.startListening(); recyclerView.setAdapter(firebaseRecyclerAdapter); }
额外的生命周期优化
记得在Activity的生命周期方法中添加adapter的监听控制,进一步避免内存泄漏:
@Override protected void onStart() { super.onStart(); if (firebaseRecyclerAdapter != null) { firebaseRecyclerAdapter.startListening(); } } @Override protected void onStop() { super.onStop(); if (firebaseRecyclerAdapter != null) { firebaseRecyclerAdapter.stopListening(); } }
补充说明
- 当你移除
recyclerView.setAdapter(firebaseRecyclerAdapter);时,页面显示的还是原来初始化的adapter数据,所以看起来数据回来了,但过滤功能自然失效——因为新的过滤adapter根本没被设置到RecyclerView上。 - 另外要确保你的Firebase数据库规则允许读取
Reference路径的数据,否则也会出现查询无结果的情况。
内容的提问来源于stack exchange,提问作者user12206552
相关产品推荐
相关产品推荐

