无法从 Firebase 实时数据库检索数据

问题描述 投票:0回答:1

我正在开发一个 Android 应用程序。在我的应用程序中,有一个 GetSupportFragment.java。该片段包含回收器视图,其中包含卡片视图。在每个卡片视图中,都会显示 centerName、centerPhoneNumber 和 centerAddress。正在从 firebase 实时数据库中检索 centerName、centerPhoneNumber 和 centerAddress。问题是,似乎无法从数据库中检索数据。

获取SupportFragment.java

package com.example.wia2007.GetSupport;

import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.cardview.widget.CardView;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;

import com.example.wia2007.GetSupport.GetSupportAdapter;
import com.example.wia2007.GetSupport.GetSupportCenterModel;
import com.example.wia2007.R;
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 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]
            ));
        }
    }*/
}

获取SupportAdapter.java

package com.example.wia2007.GetSupport;

import static com.example.wia2007.GetSupport.GetSupportCenterModel.VIEW_TYPE_CARD_VIEW;
import static com.example.wia2007.GetSupport.GetSupportCenterModel.VIEW_TYPE_HEADER;

import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.example.wia2007.R;

import java.util.ArrayList;

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) ? VIEW_TYPE_HEADER : VIEW_TYPE_CARD_VIEW;
    }

    class HeaderViewHolder extends RecyclerView.ViewHolder {
        //grabbing the views from the recycler_view_row layout file
        //serves like an onCreate method

        public HeaderViewHolder(@NonNull View itemView) {
            super(itemView);
        }
    }

    class CardViewHolder extends RecyclerView.ViewHolder {
        //grabbing the views from the recycler_view_row layout file
        //serves like an onCreate method

        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) {
        //this is where you inflate the layout, giving a look to the rows
        switch (viewType) {
            case VIEW_TYPE_HEADER:
                View headerView = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_header_get_support, parent, false);
                return new HeaderViewHolder(headerView);

            case 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) {
        //assigning values to the views we created in the recycler_view_rows layout file
        //based on position of the recycler view
        int viewType = getItemViewType(position);

        switch (viewType) {
            case VIEW_TYPE_HEADER:
                break;
            case 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);

                // Set up click listener for "Contact Now" button
                ((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() {
        //for recycler view to know the number of items to be displayed
        return getSupportCenterModels.size() + 1;
    }

}

获取SupportCenterModel.java

package com.example.wia2007.GetSupport;

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;

    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;
    }
}

my firebase

我已检查 Firebase 不为空,并且我已成功从 Android Studio 连接到 Firebase。我尝试了很多方法,但还是不行。

java android firebase android-recyclerview fragment
1个回答
0
投票

乍一看,问题出在下面这行代码:

DatabaseReference database = FirebaseDatabase.getInstance().getReference().child("Sheet1");

因此,您正在创建一个引用,该引用指向位于根节点正下方的名为

Sheet1
的节点。但是,该节点并不存在于此处,而是存在于您的结构深处的一层。在根引用和
Sheet1
节点之间,存在另一个节点,该节点很可能是用户的 UID (
1X6GN...
)。

因此,要解决此问题,您必须添加另一个对

.child()
方法的调用,如下所示:

String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference database = FirebaseDatabase.getInstance().getReference().child(uid).child("Sheet1");

现在,当您循环结果时,您将能够获取节点并将它们转换为

GetSupportCenterModel
类型的对象。

© www.soinside.com 2019 - 2024. All rights reserved.