首页 > 解决方案 > 获取 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 类型

我该如何解决?

标签: javaandroidfirebasefirebase-realtime-database

解决方案


你的参考是这样的:

 mdatabase = FirebaseDatabase.getInstance().getReference().child("Biodata");

所以在 child Biodata,然后你在它的直接 child 中迭代for (DataSnapshot postSnapshot : dataSnapshot.getChildren()),从而检索 Strings AlamatEmail

要解决此问题,您需要删除 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());
            }
        }
    }

推荐阅读