0

Mein Hauptziel besteht darin, ein RecyclerView-Element basierend auf früheren Aktionen eines Benutzers als "Favoriten" festzulegen. Ich kann diese Daten beim Klicken speichern und löschen, aber ich habe Schwierigkeiten, sie zur richtigen Zeit am richtigen Ort anzuzeigen.RecyclerView-Daten von zwei verschiedenen Firebase-Knoten abrufen und einstellen

Ich habe zwei verschiedene Knoten, die ich für diese Verwendung geschehen:

"quotes" : { 
    "0" : { 
     "Name" : "Foo", 
     "Source" : "Bar" }, 
    "1" : { 
     "Name" : "Foo", 
     "Source" : "Bar" }, 
    "2" : { 
     "Name" : "Foo", 
     "Source" : "Bar" } 
    }, 

"favorites" : { 
    "[email protected],com" : { 
     "uid0" : "0" 
     "uid1" : "2" }}} 

Also im Grunde, was ich zu tun werde versuchen: alle Zitate in einem RecyclerView anzeigen, und wenn ihre IDs zeigen in den Favoriten für diesen einzigartigen Benutzer, legen Sie es visuell als Favorit fest. Ich habe hier einen Code eingefügt, der für mich nicht funktioniert.

private void bindHeart(final ItemHeartCardBinding binding) { 
     if (inProgress) { 
      animateProgress(binding); 
     } else { 
      binding.favorite.setImageResource(R.drawable.favorite_state_list); 
     } 
     //Loop through users favorites to see if current item exists 
     FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser(); 
     DatabaseReference mRootRef = FirebaseDatabase.getInstance().getReference(); 
     String email = ""; 
     if (user != null) { 
      email = user.getEmail(); 
      email = email.replace(".", ","); 
     } 

     final DatabaseReference favoriteRef = mRootRef.child("favorites/" + email); 

     //quoteKeyStringResId is passed in here as each RecyclerView item is being created. It's the uid of each quote. 
     final Query queryRef = favoriteRef.orderByValue().startAt(quoteKeyStringResId).endAt(quoteKeyStringResId); 

     queryRef.addValueEventListener(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 

       if (dataSnapshot.getValue().toString().equals(quoteKeyStringResId)) { 
        binding.favorite.setChecked(checked); 
       } else { 
        binding.favorite.setChecked(!checked); 
       } 
} 

Antwort

0

Ich grub durch die Firebase database samples und fand einen besseren Weg, um meine Daten zu modellieren. Durch die Aufnahme aller relevanten Daten im selben Knoten kann ich alle gleichzeitig abfragen und muss nicht befürchten, RecyclerView-Objekte in der gleichen Reihenfolge zu halten. Die Dinge sind nicht so flach auf diese Weise, aber ich denke, das ist in Ordnung:

"quotes" : { 
    "0" : { 
     "Name" : "Foo", 
     "Source" : "Bar", 
     //Moved this from a separate node into here 
     "Favorites" : { 
      //Each user will be listed if favorited, and removed if unfavorited, making it easy to track and get totals 
      "userUid" : "true", 
      "userUid4" : "true" }}, 
    "1" : { 
     "Name" : "Foo", 
     "Source" : "Bar" }, 
    "2" : { 
     "Name" : "Foo", 
     "Source" : "Bar", 
     "Favorites" : { 
      "userUid" : "true" } 
    }} 
Verwandte Themen