0

I'm trying to use a FirebaseRecyclerAdapter to display data on the screen in a RecyclerView, but no data is showing up. I have used the debug mode to determine that onBindViewHolder is not called when a new item is added to the list, but it is being added to the database correctly. I've looked all over Stack Overflow and none of the posted solutions have helped.

Here is the structure of my database:

This is the structure of my database

And here is my Fragment code:

    package com.jggdevelopment.wannacook.fragments;

import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v7.app.AppCompatDelegate;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import com.firebase.ui.database.FirebaseRecyclerAdapter;
import com.firebase.ui.database.FirebaseRecyclerOptions;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.database.ChildEventListener;
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.Query;
import com.jggdevelopment.wannacook.AddItemDialogFragment;
import com.jggdevelopment.wannacook.InventoryAdapter;
import com.jggdevelopment.wannacook.InventoryItem;
import com.jggdevelopment.wannacook.MyViewHolder;
import com.jggdevelopment.wannacook.R;

import java.util.ArrayList;

/**
 * Handles actions taken inside the "Fridge" tab of the app.
 * Created by Cameron on 1/18/2018.
 */

public class FridgeFragment extends Fragment {

    private ArrayList<InventoryItem> items = new ArrayList<>();
    private static final String TAG = "FridgeFragement";
    private FirebaseRecyclerAdapter<InventoryItem, FridgeHolder> firebaseRecyclerAdapter;
    private RecyclerView rvItems;

    public FridgeFragment() {
        // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.fragment_fridge, container, false);
        DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference("/users");

        AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);

        String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
        Query query = rootRef.child(uid).child("fridge");

        //Lookup recycler view in activity layout
        rvItems = view.findViewById(R.id.fridge_list);

        // Set layout manager to position the items
        rvItems.setLayoutManager(new LinearLayoutManager(getContext()));



        FirebaseRecyclerOptions<InventoryItem> options = new FirebaseRecyclerOptions.Builder<InventoryItem>()
                .setQuery(query, InventoryItem.class)
                .build();

        firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<InventoryItem, FridgeHolder>(options) {
            @NonNull
            @Override
            public FridgeHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
                View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.inventory_card, parent, false);

                return new FridgeHolder(view);
            }

            @Override
            protected void onBindViewHolder(@NonNull FridgeHolder holder, int position, @NonNull InventoryItem item) {
                super.onBindViewHolder(holder, position);
                holder.setItem(item);
                Log.d("TAG", item.getItemName());
            }


        };


        AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);

        return view;
    }

    @Override
    public void onStart() {
        super.onStart();
        firebaseRecyclerAdapter.startListening();
        rvItems.setAdapter(firebaseRecyclerAdapter);
    }

    @Override
    public void onStop() {
        super.onStop();

        if (firebaseRecyclerAdapter != null) {
            firebaseRecyclerAdapter.stopListening();
        }
    }

    private class FridgeHolder extends RecyclerView.ViewHolder {

        private final ImageView image;
        private final TextView itemName;
        private final TextView itemQuantity;

        public FridgeHolder(View itemView) {
            super(itemView);

            image = itemView.findViewById(R.id.item_photo);
            itemName = itemView.findViewById(R.id.item_name);
            itemQuantity = itemView.findViewById(R.id.item_quantity);
        }

        public void setItem(InventoryItem item) {
            itemName.setText(item.getItemName());
            itemQuantity.setText(item.getQuantity());
        }
    }
}

Full code can be found on Github here: https://github.com/jollygreenegiant/WannaCook

Frank van Puffelen
  • 565,676
  • 79
  • 828
  • 807
Cameron
  • 1,281
  • 1
  • 19
  • 40

2 Answers2

0

Have you ensured that your database security rules are correct and that user that is signed in has permissions to read that path? If you do have a permission issue, you should see a com.google.firebase.database.DatabaseException in the logs.

amenon
  • 198
  • 7
  • Yes, it says there is a database exception. How should the permissions be set up to avoid that? – Cameron Apr 16 '18 at 00:07
  • { "rules": { "users": { "$uid": { ".write": "$uid === auth.uid" } } } } Those are the original rules, I just added ".read": "$uid === auth.uid" and now every time I click on the fridge tab to open the fragment, it loops on the "super.onBindViewHolder()" line, just calling infinitely – Cameron Apr 16 '18 at 00:16
0

In your root query, you have /users. Remove the /.

SUPERCILEX
  • 3,929
  • 4
  • 32
  • 61