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

无法从Firebase实时数据库拉取数据并在RecyclerView展示的问题

问题:Firebase实时数据库数据无法在RecyclerView展示,DataModel的setter与构造函数未被调用

无法从Firebase实时数据库拉取数据并在RecyclerView中展示,经排查发现Datamodel类的setter方法及构造函数未被FirebaseRecycler相关方法调用。


相关代码

regiesteredComplaints.java

public class regiesteredComplaints extends AppCompatActivity {
    FirebaseDatabase database;
    DatabaseReference ref;
    FirebaseAuth mauth;
    FirebaseUser user;
    RecyclerView recyc;
    complaintAdapter adapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_regiestered_complaints);
        recyc = findViewById(R.id.idRVComplaints);
        recyc.setLayoutManager(new LinearLayoutManager(this));

        mauth = FirebaseAuth.getInstance();
        user = mauth.getCurrentUser();
        database = FirebaseDatabase.getInstance("https://muskan-cba1b-default-rtdb.firebaseio.com/");

        FirebaseRecyclerOptions<Datamodel> options =
                new FirebaseRecyclerOptions.Builder<Datamodel>()
                        .setQuery(database.getReference("Users").child(user.getUid()).child("Complaints"),Datamodel.class)
                        .build();

        adapter = new complaintAdapter(options);
        recyc.setAdapter(adapter);
    }
    @Override
    protected void onStart() {
        super.onStart();
        adapter.startListening();
    }
    @Override
    protected void onStop() {
        super.onStop();
        adapter.stopListening();
    }
}

Datamodel.java

package com.example.muskan;

import com.google.firebase.database.PropertyName;

public class Datamodel {
   private String name,age,sort,image;
    private long complaintID;
    public Datamodel() {
    }


    public Datamodel(String name, String age, String sort, String image, Long complaintID) {
        this.name = name;
        this.age = age;
        this.sort = sort;
        this.image = image;
        this.complaintID = complaintID;
    }

    @PropertyName("name")
    public String getName() {
        return name;
    }
    @PropertyName("name")

    public void setName(String name) {
        this.name = name;
    }

    @PropertyName("age")
    public String getAge() {
        return age;
    }

    @PropertyName("age")
    public void setAge(String age) {
        this.age = age;
    }

    @PropertyName("sort")
    public String getSort() {
        return sort;
    }

    @PropertyName("sort")
    public void setSort(String type) {
        this.sort = type;
    }

    @PropertyName("image")
    public String getImage() {
        return image;
    }

    @PropertyName("image")
    public void setImage(String image) {
        this.image = image;
    }

    @PropertyName("complaintID")
    public long getComplaintID() {
        return complaintID;
    }

    @PropertyName("complaintID")
    public void setComplaintID(Long complaintID) {
        this.complaintID = complaintID;
    }
}

complaintAdapter.java

public class complaintAdapter extends FirebaseRecyclerAdapter<Datamodel,complaintAdapter.myviewholder> {


    public complaintAdapter(@NonNull FirebaseRecyclerOptions<Datamodel> options) {
        super(options);

    }

    @NonNull
    @Override
    public myviewholder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.complaint_rv_item,parent,false);
        return new myviewholder(view);
    }

    @Override
    protected void onBindViewHolder(@NonNull myviewholder holder, int position, @NonNull Datamodel model) {

        holder.name.setText(model.getName());
        holder.age.setText(model.getAge());
        holder.type.setText(model.getSort());
        holder.id.setText((int) model.getComplaintID());
        Glide.with(holder.img.getContext()).load(model.getImage()).into(holder.img);
    }

    static class myviewholder extends RecyclerView.ViewHolder{
        ImageView img;
        TextView name,age,type,id;
        public myviewholder(@NonNull View itemView) {
            super(itemView);
            img=(ImageView) itemView.findViewById(R.id.imagerv);
            name=(TextView) itemView.findViewById(R.id.namerv);
            age=(TextView) itemView.findViewById(R.id.agerv);
            type=(TextView) itemView.findViewById(R.id.typerv);
            id=(TextView) itemView.findViewById(R.id.complaintIDrv);    
        }
    }
}

Firebase实时数据库截图

Firebase实时数据库截图


解决方法

1. 修正字段映射不匹配问题

从数据库截图可见,数据库中字段名为complaintid(小写d),但Datamodel类中@PropertyName注解指定的是complaintID(大写D),这会导致Firebase无法正确识别字段,进而无法调用setter方法。修改Datamodel中相关代码:

@PropertyName("complaintid")
public long getComplaintID() {
    return complaintID;
}

@PropertyName("complaintid")
public void setComplaintID(long complaintID) {
    this.complaintID = complaintID;
}

同时将setter参数类型从Long改为long,和成员变量类型保持一致,避免拆箱装箱问题。

2. 统一构造函数参数类型

将带参构造函数中complaintID的参数类型从Long改为long:

public Datamodel(String name, String age, String sort, String image, long complaintID) {
    this.name = name;
    this.age = age;
    this.sort = sort;
    this.image = image;
    this.complaintID = complaintID;
}

3. 修复Adapter中的类型转换错误

在complaintAdapter的onBindViewHolder方法中,setText不接受int类型(会被当成资源ID),需将complaintID转为字符串:

holder.id.setText(String.valueOf(model.getComplaintID()));

4. 验证数据库权限

确保Firebase实时数据库规则允许当前用户读取数据,可临时设置为:

{
  "rules": {
    ".read": "auth != null",
    ".write": "auth != null"
  }
}

功能正常后再调整为更严格的权限规则。

5. 确认查询路径正确性

打印user.getUid()验证当前用户UID是否正确,同时确认Users/{uid}/Complaints路径下确实存在数据。


内容的提问来源于stack exchange,提问作者Tarun Sharma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 20:36:22