Firebase子节点数据加载到RecyclerView时TextView不显示内容
RecyclerView列表无法展示Firebase实际数据问题
问题现象
- 开发环境:Android Studio
- 异常表现:程序运行后,RecyclerView列表项内的TextView仅显示默认标题,无法加载展示Firebase Realtime Database中存储的实际业务数据
- 参考截图:
- 页面运行效果:

- Firebase数据结构:

- 页面运行效果:
- 前置校验:数据库子节点使用的字段名与代码内实体类定义完全一致
相关实现代码
ModelCategoryClass 实体类
public class ModelCategoryClass { //字段与数据库字段保持一致 String id, category, uid; long timestamp; public ModelCategoryClass() {} public ModelCategoryClass(String id, String category, String uid, long timestamp) { this.id = id; this.category = category; this.uid = uid; this.timestamp = timestamp; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getCategory() { return category; } public void setCategory(String category) { this.category = category; } public String getUid() { return uid; } public void setUid(String uid) { this.uid = uid; } public long getTimestamp() { return timestamp; } public void setTimestamp(long timestamp) { this.timestamp = timestamp; } }
AdapterCategoryClass 适配器类
public class AdapterCategoryClass extends RecyclerView.Adapter<AdapterCategoryClass.HolderCategory> { private Context context; private ArrayList<ModelCategoryClass> categoryClassArrayList; //对应rows_categorys布局文件 private RowsCategorysBinding binding; //构造方法 public AdapterCategoryClass(Context context, ArrayList<ModelCategoryClass> categoryClassArrayList) { this.context = context; this.categoryClassArrayList = categoryClassArrayList; } @NonNull @Override public HolderCategory onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { //初始化视图绑定 binding = RowsCategorysBinding.inflate(LayoutInflater.from(context), parent, false); return new HolderCategory(binding.getRoot()); } //数据绑定逻辑 @Override public void onBindViewHolder(@NonNull HolderCategory holder, int position) { ModelCategoryClass model = categoryClassArrayList.get(position); String id = model.getId(); String category = model.getId(); String uid = model.getId(); long timestamp = model.getTimestamp(); //删除按钮点击事件 holder.removeBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Toast.makeText(context,""+category,Toast.LENGTH_SHORT).show(); } }); } @Override public int getItemCount() { return categoryClassArrayList.size(); } //列表项ViewHolder public class HolderCategory extends RecyclerView.ViewHolder { TextView textViewListCatt; ImageButton removeBtn; public HolderCategory(@NonNull View itemView) { super(itemView); textViewListCatt = binding.textViewListCat; removeBtn = binding.removeBtn; } } }
CategoryAddActivity 页面类
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = ActivityCategoryAddBinding.inflate(getLayoutInflater()); setContentView(binding.getRoot()); //初始化Firebase认证 firebaseAuth = FirebaseAuth.getInstance(); ShowCategories(); private void ShowCategories() { categoryClassArrayList = new ArrayList<>(); DatabaseReference ref = FirebaseDatabase.getInstance().getReference("Categories"); ref.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { //添加数据前清空数组 categoryClassArrayList.clear(); for (DataSnapshot dataSnapshot : snapshot.getChildren()) { //从数据库子节点解析数据 ModelCategoryClass mod = dataSnapshot.getValue(ModelCategoryClass.class); //将数据添加到数组 categoryClassArrayList.add(mod); } //初始化适配器 adapterCategoryClass = new AdapterCategoryClass(CategoryAddActivity.this, categoryClassArrayList); //给RecyclerView设置适配器 binding.recycleList.setAdapter(adapterCategoryClass); } @Override public void onCancelled(@NonNull DatabaseError error) { } }); }
问题根因
- 核心逻辑缺失:适配器
onBindViewHolder方法中仅从Model对象取出了字段值,从未调用holder.textViewListCatt.setText()方法给列表项TextView设置从Firebase解析到的分类内容,是文本只显示默认标题的直接原因。同时该方法内category、uid字段均错误调用model.getId()取值,即便补充赋值逻辑,也会拿到错误的id值而非实际分类名称。 - View Binding作用域错误:将
RowsCategorysBinding声明为适配器全局变量,在onCreateViewHolder每次创建条目时都会覆盖该全局变量值,会导致所有列表项的控件引用指向最后一次创建的条目布局,列表滑动时会出现内容错位、点击事件触发异常的问题。 - 列表刷新逻辑不合理:每次Firebase数据回调都重新创建全新的适配器实例绑定到RecyclerView,没有针对已有适配器调用
notifyDataSetChanged()刷新数据,会产生不必要的性能开销,也容易导致列表状态异常。 - 缺少必要配置:代码中未给RecyclerView设置
LinearLayoutManager等布局管理器,部分场景下RecyclerView无法正常完成条目测量与绘制,也会导致展示异常。
内容的提问来源于stack exchange,提问作者Horalx SAx
相关产品推荐
相关产品推荐

