KoralReef
KoralReef

Reputation: 41

data from Firebase - android recycler view repopulation

I am having a hard time on how to solve this recycler view that keeps on repopulating the view in my fragment if there are changes in my database. here is my fragment for my recycler view..

fragment.java @Override

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

    Toast.makeText(getContext(), "this is a review", Toast.LENGTH_SHORT).show();

    databaseReference = FirebaseDatabase.getInstance().getReference();
    firebaseAuth = FirebaseAuth.getInstance();
    firebaseUser = firebaseAuth.getCurrentUser();

    //RETRIEVE DATAS
    loadEntries();

    drAdapter = new reviewAdapter(review);
    recyclerView = (RecyclerView) v.findViewById(R.id.reviewRecyvlerView);
    rvLayoutManager = new LinearLayoutManager(getActivity());
    recyclerView.setLayoutManager(rvLayoutManager);
    recyclerView.setItemAnimator(new DefaultItemAnimator());
    recyclerView.setAdapter(drAdapter);

    return v;
}

and in my loadentries()

private void loadEntries(){
        review = new ArrayList<>();
        dbReference = FirebaseDatabase.getInstance().getReference().child("Review");
        dbReference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {  
                for (DataSnapshot mySnapshot : dataSnapshot.getChildren()){

//                    System.out.println(dataSnapshot.getChildrenCount());
                    String userID = mySnapshot.getKey();
                    Review reviews = mySnapshot.getValue(Review.class);
                    String fname = (String) dataSnapshot.child(userID).child("firstname").getValue();
                    String lname = (String) dataSnapshot.child(userID).child("lastname").getValue();

                    review.setFName(fname);
                    review.setLName(lname);
                    review.add(reviews);
                }
                drAdapter.notifyDataSetChanged();
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });
    }

i think it's because of my review.add(reviews) that keeps on populating the fragment (redundancy). the recycler view adds another view if there are any changes in my database and i don't know how to handle this redundancy.

Any alternative solutions or suggestions would be so much appreciated :) . willing to learn :). Thank you very much.

Upvotes: 1

Views: 157

Answers (1)

Alex Mamo
Alex Mamo

Reputation: 138824

You need to move the declaration of your review = new ArrayList<>(); inside the onDataChange() method before that for loop starts like this:

private void loadEntries(){
    dbReference = FirebaseDatabase.getInstance().getReference().child("Review");
    dbReference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            ArrayList review = new ArrayList<>();
            for (DataSnapshot mySnapshot : dataSnapshot.getChildren()){

                //System.out.println(dataSnapshot.getChildrenCount());
                String userID = mySnapshot.getKey();
                Review reviews = mySnapshot.getValue(Review.class);
                String fname = (String) dataSnapshot.child(userID).child("firstname").getValue();
                String lname = (String) dataSnapshot.child(userID).child("lastname").getValue();

                review.setFName(fname);
                review.setLName(lname);
                review.add(reviews);
            }
            drAdapter.notifyDataSetChanged();
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
}

Hope it helps.

Upvotes: 1

Related Questions