DessertsAndStuff
DessertsAndStuff

Reputation: 185

Data from Firebase won't show in my RecyclerView

The data is being fetched in the fetchData() method in FirebaseHelper, but isn't actually being stored in the variables petInfo and imgURL in the CardViewAdapter. This results in no cards showing in the RecyclerView fragment. When the app initializes, the dataset is 0, runs through the fetchData and the dataset is the size of items but leaves petInfo and imgURL null.

FirebaseHelper:

public class FirebaseHelper {
    private DatabaseReference mDatabase;


    Boolean saved = null;
    ArrayList<AnimalType> animal = new ArrayList<>();

    public FirebaseHelper(DatabaseReference mDatabase) {
        this.mDatabase = mDatabase;
    }

    //Save
    public Boolean save (AnimalType animalType){
        if (animalType==null){
            saved = false;
        }
        else{
            try{
                mDatabase.child("AnimalType").push().setValue(animalType);
                saved=true;
            }catch (DatabaseException e){
                e.printStackTrace();
                saved=false;
            }
        }
        return saved;
    }

    //Read
    public ArrayList<AnimalType> retrieve(){
        mDatabase.addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                fetchData(dataSnapshot);
                Log.i(TAG, "onChildAdded");
            }

            @Override
            public void onChildChanged(DataSnapshot dataSnapshot, String s) {
                fetchData(dataSnapshot);
                Log.i(TAG, "onChildChanged");
            }

            @Override
            public void onChildRemoved(DataSnapshot dataSnapshot) {

            }

            @Override
            public void onChildMoved(DataSnapshot dataSnapshot, String s) {

            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });
        return animal;
    }

    private void fetchData (DataSnapshot dataSnapshot){
        animal.clear();
        for (DataSnapshot ds : dataSnapshot.getChildren()){
            AnimalType animalType = new AnimalType();
            animalType.setPetInfo(ds.getValue(AnimalType.class).getPetInfo());
            animalType.setImgURL(ds.getValue(AnimalType.class).getImgURL());
            animal.add(animalType);
        }
    }

}

Adapter:

public class CardViewAdapter extends RecyclerView.Adapter<CardViewAdapter.ViewHolder> {

    Context mContext;
    private List<AnimalType> mAnimalData = new ArrayList<>();

    public class ViewHolder extends RecyclerView.ViewHolder {
        public TextView petInfo;
        public ImageView imgURL;
        public ViewHolder(View view){
            super(view);
            imgURL = (ImageView) view.findViewById(R.id.pet_image);
            petInfo = (TextView) view.findViewById(R.id.pet_description);
        }
    }

    //constructor
    public CardViewAdapter(Context mContext, List<AnimalType> mAnimalData){
        this.mAnimalData = mAnimalData;
    }

    //create new views
    @Override
    public CardViewAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType){
        View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_layout, parent, false);
        ViewHolder viewHolder = new ViewHolder(itemView);

        mContext = parent.getContext();

        return viewHolder;
    }

    //replace contents of view
    @Override
    public void onBindViewHolder(ViewHolder holder, int position){
        holder.petInfo.setText(mAnimalData.get(position).getPetInfo());
        PicassoClient.downloadImage(mContext,mAnimalData.get(position).getImgURL(), holder.imgURL);


    }

    //return size of dataset
    public int getItemCount(){
        return mAnimalData.size();
    }
}

Fragment:

public class DogFragment extends Fragment {
    public static final String ARG_PAGE = "ARG_PAGE";

    private int mPage;

    private RecyclerView mRecyclerView;
    private RecyclerView.Adapter mCardAdapter;
    private RecyclerView.LayoutManager mCardLayoutManager;

    DatabaseReference mDatabaseReference;
    FirebaseHelper helper;


    public static DogFragment newInstance(int page) {
        DogFragment dogFragment = new DogFragment();
        Bundle args = new Bundle();
        args.putInt(ARG_PAGE, page);
        dogFragment.setArguments(args);
        return dogFragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mPage = getArguments().getInt(ARG_PAGE);

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View rootView = inflater.inflate(R.layout.fragment_dog, container, false);

        //cardview
        mRecyclerView = (RecyclerView)rootView.findViewById(R.id.card_view);

        //setup firebase
        mDatabaseReference = FirebaseDatabase.getInstance().getReference();
        helper= new FirebaseHelper(mDatabaseReference);

        //create adapter class
        //mCardAdapter = new CardViewAdapter(mAimalTypeList);
        mCardAdapter = new CardViewAdapter(getActivity().getApplicationContext(), helper.retrieve());
        mRecyclerView.setAdapter(mCardAdapter);

        //add linear layout manager
        mCardLayoutManager = new LinearLayoutManager(getActivity());
        mRecyclerView.setLayoutManager(mCardLayoutManager);

        //preparePetData();

        return rootView;
    }
}

Picasso:

public class PicassoClient {

    public static void downloadImage(Context context, String url, ImageView img){
        if(url != null && url.length()>0){
            Picasso.with(context).load(url).placeholder(R.drawable.placeholder).into(img);
        }
        else {
            Picasso.with(context).load(R.drawable.placeholder).into(img);
        }
    }
}

Upvotes: 0

Views: 456

Answers (1)

John O&#39;Reilly
John O&#39;Reilly

Reputation: 10350

Your call to helper.retrieve() is kicking off mDatabase.addChildEventListener the results of which will come back asynchronously....in the meantime you're returning empty list from that method (default value of animal). You need to update adapter when results come back (after you've called fetchData(dataSnapshot);)

Upvotes: 1

Related Questions