从Firebase获取节点数据到RecyclerView时出现解析错误求助
Firebase数据加载到RecyclerView的问题修复
核心问题分析
- 缺少无参构造函数:Firebase Realtime Database反序列化Java对象时必须依赖无参构造,否则无法实例化对象,这是导致
getValue(Machines.class)报错的核心原因。 - 字段名大小写不匹配:Firebase数据中的键为
ID(大写),但实体类Machines中对应字段是id(小写),导致数据映射失败。 - 适配器重复设置:
MainActivity中在Firebase回调外提前设置了空适配器,会覆盖回调内初始化的有效适配器,导致列表为空。 - TextView赋值错误:直接将Integer类型的
cap1/cap2传入setText(),会被当作资源ID而非文本内容,引发显示异常或崩溃。 - JSON格式错误:Firebase数据中
machine4的cap2后存在多余逗号,导致JSON解析失败。
1. 修正Machines实体类
添加无参构造函数,并通过@PropertyName注解匹配Firebase的字段名:
package com.example.machinerecycle; import com.google.firebase.database.PropertyName; public class Machines { @PropertyName("ID") private String id; private Integer cap1, cap2, state; // Firebase反序列化必须的无参构造 public Machines() {} public Machines(String id, Integer cap1, Integer cap2, Integer state) { this.id = id; this.cap1 = cap1; this.cap2 = cap2; this.state = state; } @PropertyName("ID") public String getId() { return id; } @PropertyName("ID") public void setId(String id) { this.id = id; } public Integer getCap1() { return cap1; } public void setCap1(Integer cap1) { this.cap1 = cap1; } public Integer getCap2() { return cap2; } public void setCap2(Integer cap2) { this.cap2 = cap2; } public Integer getState() { return state; } public void setState(Integer state) { this.state = state; } }
2. 修正MainActivity.java
移除回调外的多余适配器设置,确保仅在数据加载完成后初始化适配器:
package com.example.machinerecycle; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import android.os.Bundle; import com.google.firebase.database.DataSnapshot; import com.google.firebase.database.DatabaseError; import com.google.firebase.database.DatabaseReference; import com.google.firebase.database.FirebaseDatabase; import com.google.firebase.database.ValueEventListener; import java.util.ArrayList; public class MainActivity extends AppCompatActivity { DatabaseReference databaseReference; ArrayList<Machines> machines; myAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); RecyclerView recyclerView = findViewById(R.id.rvMachines); recyclerView.setHasFixedSize(false); recyclerView.setLayoutManager(new LinearLayoutManager(this)); databaseReference = FirebaseDatabase.getInstance().getReference("machines"); databaseReference.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { if (snapshot.exists()) { machines = new ArrayList<>(); for (DataSnapshot dataSnapshot : snapshot.getChildren()) { Machines machine = dataSnapshot.getValue(Machines.class); machines.add(machine); } adapter = new myAdapter(machines); recyclerView.setAdapter(adapter); } } @Override public void onCancelled(@NonNull DatabaseError error) { // 添加错误日志便于排查 error.toException().printStackTrace(); } }); // 移除这行多余的空适配器设置 // recyclerView.setAdapter(adapter); } }
3. 修正myAdapter.java
将Integer类型数据转为字符串后再设置给TextView:
package com.example.machinerecycle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; import java.util.ArrayList; public class myAdapter extends RecyclerView.Adapter<myAdapter.ViewHolder> { ArrayList<Machines> machines; public myAdapter(ArrayList<Machines> machines) { this.machines = machines; } @NonNull @Override public myAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_machines, parent, false); return new ViewHolder(view); } @Override public void onBindViewHolder(@NonNull myAdapter.ViewHolder holder, int position) { holder.id.setText(machines.get(position).getId()); // 将Integer转为字符串避免资源ID解析错误 holder.cap1.setText(String.valueOf(machines.get(position).getCap1())); holder.cap2.setText(String.valueOf(machines.get(position).getCap2())); } @Override public int getItemCount() { return machines.size(); } public class ViewHolder extends RecyclerView.ViewHolder { public TextView id, cap1, cap2; public ViewHolder(@NonNull View itemView) { super(itemView); id = itemView.findViewById(R.id.idMachine); cap1 = itemView.findViewById(R.id.cap1); cap2 = itemView.findViewById(R.id.cap2); } } }
4. 修正Firebase数据格式
移除machine4中cap2后的多余逗号,确保JSON格式合法:
{ "machines": { "machine1": { "ID": "M200", "cap1": 1, "cap2": 1 }, "machine10": { "ID": "M210", "cap1": 1, "cap2": 1 }, "machine2": { "ID": "M202", "cap1": 1, "cap2": 1 }, "machine3": { "ID": "M203", "cap1": 1, "cap2": 1 }, "machine4": { "ID": "M204", "cap1": 1, "cap2": 1 } } }
内容的提问来源于stack exchange,提问作者Houmes
相关产品推荐
相关产品推荐

