Android应用无法从Firebase实时数据库获取数据求助
无法从Firebase实时数据库获取数据填充RecyclerView
开发Android应用时,GetSupportFragment内的RecyclerView需展示从Firebase实时数据库获取的centerName、centerPhoneNumber和centerAddress信息,但目前无法加载数据。已确认数据库非空,Android Studio已成功连接Firebase。
相关代码
GetSupportFragment.java
public class GetSupportFragment extends Fragment { private static final String TAG = "GetSupportFragment"; RecyclerView recyclerView; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_get_support, container, false); //setupCenterModels(); DatabaseReference database = FirebaseDatabase.getInstance().getReference().child("Sheet1"); ArrayList<GetSupportCenterModel> centerModels = new ArrayList<>(); GetSupportAdapter adapter = new GetSupportAdapter(requireContext(), centerModels); recyclerView = view.findViewById(R.id.rv_centers); recyclerView.setAdapter(adapter); recyclerView.setLayoutManager(new LinearLayoutManager(requireContext())); database.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { centerModels.clear(); for (DataSnapshot dataSnapshot : snapshot.getChildren()) { GetSupportCenterModel getSupportCenterModel = dataSnapshot.getValue(GetSupportCenterModel.class); centerModels.add(getSupportCenterModel); } adapter.notifyDataSetChanged(); Log.d(TAG, "Data loaded successfully. Size: " + centerModels.size()); } @Override public void onCancelled(@NonNull DatabaseError error) { Log.e(TAG, "Error loading data: " + error.getMessage()); } }); return view; } @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); } /* private void setupCenterModels() { String[] centerNames = getResources().getStringArray(R.array.center_names); String[] centerPhoneNumbers = getResources().getStringArray(R.array.center_phone_numbers); String[] centerAddresses = getResources().getStringArray(R.array.center_addresses); for (int i = 0; i < centerNames.length; i++) { centerModels.add(new GetSupportCenterModel( centerNames[i], centerPhoneNumbers[i], centerAddresses[i] )); } }*/ }
GetSupportAdapter.java
public class GetSupportAdapter extends RecyclerView.Adapter { Context context; ArrayList<GetSupportCenterModel> getSupportCenterModels; //constructor public GetSupportAdapter(Context context, ArrayList<GetSupportCenterModel> getSupportCenterModels) { this.context = context; this.getSupportCenterModels = getSupportCenterModels; } @Override public int getItemViewType(int position) { return (position == 0) ? GetSupportCenterModel.VIEW_TYPE_HEADER : GetSupportCenterModel.VIEW_TYPE_CARD_VIEW; } class HeaderViewHolder extends RecyclerView.ViewHolder { public HeaderViewHolder(@NonNull View itemView) { super(itemView); } } class CardViewHolder extends RecyclerView.ViewHolder { TextView tvCenterName, tvCenterPhoneNumber, tvCenterAddress; Button btnContactNow; public CardViewHolder(@NonNull View itemView) { super(itemView); tvCenterName = itemView.findViewById(R.id.tv_center_name); tvCenterPhoneNumber = itemView.findViewById(R.id.tv_center_phone_number); tvCenterAddress = itemView.findViewById(R.id.tv_center_address); btnContactNow = itemView.findViewById(R.id.btn_contact_now); } public void setViews(String centerName, String centerPhoneNumber, String centerAddress) { tvCenterName.setText(centerName); tvCenterPhoneNumber.setText(centerPhoneNumber); tvCenterAddress.setText(centerAddress); } } @NonNull @Override public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { switch (viewType) { case GetSupportCenterModel.VIEW_TYPE_HEADER: View headerView = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_header_get_support, parent, false); return new HeaderViewHolder(headerView); case GetSupportCenterModel.VIEW_TYPE_CARD_VIEW: View cardView = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_cardview_get_support, parent, false); return new CardViewHolder(cardView); default: return null; } } @Override public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { int viewType = getItemViewType(position); switch (viewType) { case GetSupportCenterModel.VIEW_TYPE_HEADER: break; case GetSupportCenterModel.VIEW_TYPE_CARD_VIEW: String centerName = getSupportCenterModels.get(position - 1).getCenterName(); String centerPhoneNumber = getSupportCenterModels.get(position - 1).getCenterPhoneNumber(); String centerAddress = getSupportCenterModels.get(position - 1).getCenterAddress(); ((CardViewHolder) holder).setViews(centerName, centerPhoneNumber, centerAddress); ((CardViewHolder) holder).btnContactNow.setOnClickListener(args -> { Intent phone_intent = new Intent(Intent.ACTION_DIAL); phone_intent.setData(Uri.parse("tel:" + centerPhoneNumber)); context.startActivity(phone_intent); }); break; default: break; } } @Override public int getItemCount() { return getSupportCenterModels.size() + 1; } }
GetSupportCenterModel.java
public class GetSupportCenterModel { public static final int VIEW_TYPE_HEADER = 0; public static final int VIEW_TYPE_CARD_VIEW = 1; int viewType; String centerAddress; String centerName; String centerPhoneNumber; // 空参构造函数:Firebase反序列化必须 public GetSupportCenterModel() {} public GetSupportCenterModel(String centerAddress, String centerName, String centerPhoneNumber) { this.centerAddress = centerAddress; this.centerName = centerName; this.centerPhoneNumber = centerPhoneNumber; } public int getViewType() { return viewType; } public String getCenterAddress() { return centerAddress; } public String getCenterName() { return centerName; } public String getCenterPhoneNumber() { return centerPhoneNumber; } }
Firebase数据库结构

排查修复要点
- 添加Model类空参构造:Firebase使用Jackson进行反序列化,必须有无参构造函数,否则无法将数据库数据转为Model对象
- 修正Adapter中类型常量引用:VIEW_TYPE_HEADER和VIEW_TYPE_CARD_VIEW定义在Model类中,Adapter中需通过
GetSupportCenterModel.前缀引用,否则会报未定义错误 - 检查数据库权限规则:默认规则仅允许认证用户访问,测试阶段可临时设置为公开读写(上线后需修改为安全规则):
{ "rules": { ".read": true, ".write": true } } - 验证字段名匹配:确保Firebase中的键名(如
centerName)与Model类的字段名完全一致(大小写、拼写均需匹配) - 查看日志定位问题:通过Logcat查看
GetSupportFragment标签下的日志,确认onDataChange是否执行、centerModels.size()数值,以及onCancelled是否输出错误信息
内容的提问来源于stack exchange,提问作者NotTwoShake
相关产品推荐
相关产品推荐

