Reputation: 41
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
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