Android Studio中Firebase搜索RecyclerView未执行onCreateViewHolder求助
解决Firebase RecyclerView不显示结果&onCreateViewHolder未执行的问题
嘿,我看了你遇到的麻烦——RecyclerView没反应,调试发现onCreateViewHolder压根没跑,这肯定是新版FirebaseUI的用法没踩对,毕竟你说原教程的写法过时了,咱们一步步把坑填上:
核心问题分析
- 混合了新旧版FirebaseUI的写法:你代码里保留了旧版的
populateViewHolder方法,但新版FirebaseUI已经把这个方法移除了,取而代之的是onBindViewHolder,这会导致适配器逻辑冲突 - 没启动Firebase数据监听:新版FirebaseRecyclerAdapter必须调用
startListening()才会开始监听Firebase数据变化,不然适配器不会触发任何ViewHolder的创建和数据绑定 - 适配器是局部变量:你把适配器定义在
firebaseUserSearch方法里,没法在Activity的生命周期方法里管理监听的启停,容易出现内存泄漏或者数据不更新的问题
修复后的完整代码
第一步:把适配器改成类成员变量
在MainTestActivity类里添加:
private FirebaseRecyclerAdapter<UsersTest, UsersViewHolder> firebaseRecyclerAdapter;
第二步:修正FirebaseRecyclerAdapter的实现
替换原来的firebaseUserSearch方法:
private void firebaseUserSearch(String searchText) { Toast.makeText(MainTestActivity.this, "Started Search", Toast.LENGTH_LONG).show(); Query firebaseSearchQuery = mUserDatabase.orderByChild("name").startAt(searchText).endAt(searchText + "\uf8ff"); FirebaseRecyclerOptions<UsersTest> options = new FirebaseRecyclerOptions.Builder<UsersTest>() .setQuery(firebaseSearchQuery, UsersTest.class) .build(); // 正确实现新版FirebaseRecyclerAdapter,移除废弃的populateViewHolder firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<UsersTest, UsersViewHolder>(options) { @NonNull @Override public UsersViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()) .inflate(R.layout.list_test_layout, parent, false); return new UsersViewHolder(view); } @Override protected void onBindViewHolder(@NonNull UsersViewHolder holder, int position, @NonNull UsersTest model) { // 把原来populateViewHolder里的绑定逻辑移到这里 holder.setDetails(getApplicationContext(), model.getName(), model.getStatus(), model.getImage()); } }; mResultList.setAdapter(firebaseRecyclerAdapter); // 启动数据监听 firebaseRecyclerAdapter.startListening(); }
第三步:添加生命周期方法管理监听启停
在MainTestActivity里重写这两个方法,确保在Activity可见时监听数据,不可见时停止,避免浪费资源:
@Override protected void onStart() { super.onStart(); if (firebaseRecyclerAdapter != null) { firebaseRecyclerAdapter.startListening(); } } @Override protected void onStop() { super.onStop(); if (firebaseRecyclerAdapter != null) { firebaseRecyclerAdapter.stopListening(); } }
额外检查项
- 确保你的
UsersTest类的字段名称、大小写和Firebase数据库里的字段完全一致(比如数据库里是name,类里就不能写成UserName) - 检查
list_test_layout布局文件里的控件ID,和UsersViewHolder里findViewById的ID完全匹配 - 确认Firebase数据库的规则允许读取
UsersTest节点(如果是测试阶段,可以暂时设置为公开读取,上线后再改回安全规则)
内容的提问来源于stack exchange,提问作者Hyung Tae Carapeto Figur
相关产品推荐
相关产品推荐

