You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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数据库结构

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 16:44:55