无法应用FirebaseRecyclerAdapter构造方法?请帮忙排查代码问题
解决FirebaseRecyclerAdapter构造器参数不匹配的问题
这个报错很典型——你还在使用FirebaseUI Database旧版本的适配器构造方式,但新版本(大概从FirebaseUI 3.x开始)已经彻底废弃了那种多参数的构造器,改用FirebaseRecyclerOptions来配置适配器。我帮你一步步修正代码:
第一步:清理无用代码
先把你onCreate方法里这段完全没用的代码删掉:
FirebaseRecyclerOptions<BlogViewHolder> options1; options1 = new FirebaseRecyclerOptions.Builder<BlogViewHolder>() .setQuery(mRef, BlogViewHolder.class) .build();
FirebaseRecyclerOptions只需要针对你的数据模型Blog,不需要针对ViewHolder,这段代码纯粹是干扰。
第二步:用正确的方式初始化FirebaseRecyclerAdapter
你已经在onCreate里正确创建了FirebaseRecyclerOptions<Blog> options,现在要在onStart里用这个options来创建适配器,而不是传一堆零散的参数。同时要修复onCreateViewHolder的实现(你之前返回null肯定会崩溃),还要删掉废弃的populateViewHolder方法。
修改后的onStart方法应该是这样的:
@Override protected void onStart(){ super.onStart(); mAuth.addAuthStateListener(mAuthListener); // 直接用之前创建好的options来初始化适配器 FirebaseRecyclerAdapter<Blog, BlogViewHolder> adapter = new FirebaseRecyclerAdapter<Blog, BlogViewHolder>(options) { @NonNull @Override public BlogViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { // 这里要正确inflater你的item布局,返回ViewHolder实例 View view = LayoutInflater.from(parent.getContext()) .inflate(R.layout.blog_row, parent, false); return new BlogViewHolder(view); } @Override protected void onBindViewHolder(@NonNull BlogViewHolder holder, int position, @NonNull Blog model) { // 绑定数据的逻辑写在这里就够了 holder.setTitle(model.getTitle()); holder.setDesc(model.getDesc()); holder.setImage(getApplicationContext(), model.getImage()); } }; mBlogList.setAdapter(adapter); // 别忘了启动适配器监听数据变化! adapter.startListening(); // 把局部适配器赋值给成员变量,方便后续生命周期管理 mrecyclerAdapter = adapter; }
第三步:补充适配器的生命周期管理
为了避免内存泄漏,记得在onStop方法里停止适配器的监听:
@Override protected void onStop() { super.onStop(); if (mrecyclerAdapter != null) { mrecyclerAdapter.stopListening(); } mAuth.removeAuthStateListener(mAuthListener); }
额外注意点
- 确保你的
Blog类有无参构造函数,并且所有字段的getter方法都正确实现,否则Firebase无法正确解析数据库中的数据。 - 如果你还没在项目中引入LayoutInflater,记得在MainActivity顶部添加导入语句:
import android.view.LayoutInflater;
修改完这些,你的代码应该就能正常运行了,不会再出现构造器参数不匹配的报错。
内容的提问来源于stack exchange,提问作者FAiZ Sharief
相关产品推荐
相关产品推荐

