You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Firebase子节点数据加载到RecyclerView时TextView不显示内容

RecyclerView列表无法展示Firebase实际数据问题

问题现象

  • 开发环境:Android Studio
  • 异常表现:程序运行后,RecyclerView列表项内的TextView仅显示默认标题,无法加载展示Firebase Realtime Database中存储的实际业务数据
  • 参考截图:
    • 页面运行效果:addCategoryclass界面
    • Firebase数据结构:Firebase Realtime Database数据结构
  • 前置校验:数据库子节点使用的字段名与代码内实体类定义完全一致

相关实现代码

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) {

        }
    });
}

问题根因

  1. 核心逻辑缺失:适配器onBindViewHolder方法中仅从Model对象取出了字段值,从未调用holder.textViewListCatt.setText()方法给列表项TextView设置从Firebase解析到的分类内容,是文本只显示默认标题的直接原因。同时该方法内category、uid字段均错误调用model.getId()取值,即便补充赋值逻辑,也会拿到错误的id值而非实际分类名称。
  2. View Binding作用域错误:将RowsCategorysBinding声明为适配器全局变量,在onCreateViewHolder每次创建条目时都会覆盖该全局变量值,会导致所有列表项的控件引用指向最后一次创建的条目布局,列表滑动时会出现内容错位、点击事件触发异常的问题。
  3. 列表刷新逻辑不合理:每次Firebase数据回调都重新创建全新的适配器实例绑定到RecyclerView,没有针对已有适配器调用notifyDataSetChanged()刷新数据,会产生不必要的性能开销,也容易导致列表状态异常。
  4. 缺少必要配置:代码中未给RecyclerView设置LinearLayoutManager等布局管理器,部分场景下RecyclerView无法正常完成条目测量与绘制,也会导致展示异常。

内容的提问来源于stack exchange,提问作者Horalx SAx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 16:48:18