0

I am working on an Android application. In my application, there is a GetSupportFragment.java. The fragment contains recycler view that has cardviews in it. In each card view, there will be centerName, centerPhoneNumber and centerAddress displayed. The centerName, centerPhoneNumber and centerAddress is being retrieved from the firebase real time database. The problem is, it seemed like the data cannot be retrieved from the database.

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

}

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;

    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

I have checked that the firebase is not empty and I have successfully connected to firebase from android studio. I tried many ways but it is still not working.

1 Answer 1

2

At first glance, it seems to me that the problem lies in the following line of code:

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

So you're creating a reference that points to a node called Sheet1 that exists right under your root node. However, that node isn't present there, but one level deep in your structure. Between the root reference and the Sheet1 node, there is another node present, which is most likely the UID (1X6GN...) of the user.

So to solve this, you have to add another call to the .child() method as you can see below:

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

Now, when you loop through the results, you'll be able to get the nodes and convert them to objects of type GetSupportCenterModel.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.