无法从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实时数据库截图

解决方法
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
相关产品推荐
相关产品推荐

