java - 获取 Firebase 数据库记录到 RecyclerView
问题描述
我最近在学习 firebase 数据库。现在我正在尝试将记录放入RecyclerView
这是我所做的
BiodataModel value;
DatabaseReference mdatabase;
private List<BiodataModel> mBiodata;
BiodataAdapter dAdapter;
List<BiodataModel> userlist = new ArrayList<>();
mdatabase = FirebaseDatabase.getInstance().getReference().child("Biodata");
mdatabase.keepSynced(true);
mdatabase.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
userlist = new ArrayList<>();
if (dataSnapshot != null && dataSnapshot.getValue() != null) {
try {
for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
BiodataModel bioModel = postSnapshot.getValue(BiodataModel.class); // The problem is here
userlist.add(bioModel);
}
} catch (Exception ex) {
Log.e("MYERROR", ex.getMessage());
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.d("MYERROR", databaseError.getMessage());
}
});
这是我的适配器
public class BiodataAdapter extends RecyclerView.Adapter<BiodataAdapter.MyViewHolder>{
private List<BiodataModel> bioList;
public class MyViewHolder extends RecyclerView.ViewHolder {
public TextView fullname;
public MyViewHolder(View view) {
super(view);
fullname = (TextView) view.findViewById(R.id.fullname);
}
}
public BiodataAdapter(){
}
public BiodataAdapter(List<BiodataModel> bioList) {
this.bioList = bioList;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.biodata_list_row, parent, false);
return new MyViewHolder(itemView);
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
BiodataModel bio = bioList.get(position);
holder.fullname.setText(bio.getFullname());
}
@Override
public int getItemCount() {
return bioList.size();
}
}
这是我的模特
public class BiodataModel {
public String fullname,email,noTelp,alamat;
public BiodataModel(String fullname, String email, String noTelp,String alamat){
this.fullname = fullname;
this.email = email;
this.noTelp = noTelp;
this.alamat = alamat;
}
public String getFullname() {
return fullname;
}
public String getEmail() {
return email;
}
public String getNoTelp() {
return noTelp;
}
public String getAlamat() {
return alamat;
}
public void setFullname(String fullname) {
this.fullname = fullname;
}
public void setEmail(String email) {
this.email = email;
}
public void setNoTelp(String noTelp) {
this.noTelp = noTelp;
}
public void setAlamat(String alamat) {
this.alamat = alamat;
}
}
我得到这个错误
无法将 java.lang.String 类型的对象转换为 ZZZZ.BiodataModel 类型
我该如何解决?
解决方案
你的参考是这样的:
mdatabase = FirebaseDatabase.getInstance().getReference().child("Biodata");
所以在 child Biodata
,然后你在它的直接 child 中迭代for (DataSnapshot postSnapshot : dataSnapshot.getChildren())
,从而检索 Strings Alamat
,Email
。
要解决此问题,您需要删除 for 循环并尝试以下操作:
mdatabase.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
userlist = new ArrayList<>();
if (dataSnapshot != null && dataSnapshot.getValue() != null) {
try {
BiodataModel bioModel = dataSnapshot.getValue(BiodataModel.class);
userlist.add(bioModel);
} catch (Exception ex) {
Log.e("MYERROR", ex.getMessage());
}
}
}
推荐阅读
- python - 如何使用 python 请求正确地形成对该网站的 POST 请求
- sql-server - 唯一索引不起作用
- cassandra - 在 Cassandra 中订购
- knockout.js - 如果分钟/秒/毫秒为“0”,为什么 datetimepicker 会破坏年份值
- php - 在没有给定直接 IP 或域名的情况下处理服务器上的本地 php 文件
- html - 尝试使用 document.getElementbyid.innerHTML 向 HTML DOM 添加一个按钮
- python - 机器学习 - 具有文本数据类型的独立列
- python - 如何监控 USB 设备的插入?
- reactjs - 不同列表项的相同数据。反应.js
- javascript - javascript如何单线程和异步