1

Ich habe eine harte Zeit auf, wie diese Recycler-Ansicht zu lösen, die die Ansicht in meinem Fragment neu zu füllen, wenn Änderungen in meiner Datenbank sind. hier ist mein Fragment für meine Recycler Ansicht ..Daten von Firebase - Android-Recycler-Ansicht Repopulation

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

und in meinem 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) { 

      } 
     }); 
    } 

Ich denke, es wegen meiner review.add ist (Reviews), die das Fragment weiter füllen (Redundanz). Die Recycler-Ansicht fügt eine weitere Ansicht hinzu, wenn sich Änderungen in meiner Datenbank ergeben, und ich weiß nicht, wie ich mit dieser Redundanz umgehen soll.

Alle alternativen Lösungen oder Vorschläge würden so sehr geschätzt werden :). bereit zu lernen :). Vielen Dank.

Antwort

1

Sie müssen die Deklaration Ihrer review = new ArrayList<>(); innerhalb des onDataChange() Methode bewegen, bevor die for-Schleife wie folgt beginnt:

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) { 

     } 
    }); 
} 

Hoffe, es hilft.

+0

Es gibt Versuch zurück, virtuelles Methon auf dem öffentlichen int aufzurufen getItemCount() {return mReviews.size();} danke übrigens, geschätzt :). – KoralReef