2017-03-13 3 views
0

Ich bin hier verwirrt und wirklich am Ende auf der Linie, ich habe eine ähnliche Funktion in meinem Projekt eingerichtet. Wenn ein Benutzer die gleiche Taste einmal drückt, wird der gleiche Zähler von 0 auf 1 (gefällt) aktualisiert und die gleiche Bildschaltfläche (Farbe ändern) wird erfolgreich aktualisiert. wenn sie zweimal gedrückt wird, wird der Zähler von 1 auf 0 (ungleich) aktualisiert.Firebase wie Zähler

Das Problem ist, wenn ein anderer Benutzer auch die gleiche Taste drücken, um den gleichen Beitrag zu mögen, der gleiche Zähler wird nicht von 1 bis 2 aktualisiert. Bitte helfen. Ich hoffe, das ist klar. Unten ist der Code.

viewHolder.mLikebtn.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 

     mProcessLike = true; 
     mDatabaseLikeCount = FirebaseDatabase.getInstance().getReference().child("Notes").child(post_key).child("likecount"); 

     mDatabaseLikeCount.keepSynced(true); 
     mDatabaseLike.addValueEventListener(new ValueEventListener() { 

      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       if (mProcessLike) { 
        if (dataSnapshot.child(post_key).hasChild(auth.getCurrentUser().getUid())) { 
         Log.i("D Diary", "User has already Liked. So it can be considered as Unliked."); 
         mDatabaseLike.child(post_key).child(auth.getCurrentUser().getUid()).removeValue(); 
         mDatabaseLikeCount.setValue(likeCount = likeCount - 1); 
         mProcessLike = false; 
        } else { 
         Log.i("D Diary", "User Liked"); 
         mDatabaseLike.child(post_key).child(auth.getCurrentUser().getUid()).setValue(auth.getCurrentUser().getDisplayName()); 
         mDatabaseLikeCount.setValue(likeCount = likeCount + 1); 
         Log.i(dataSnapshot.getKey(), dataSnapshot.getChildrenCount() + "Count"); 
         mProcessLike = false; 
        } 
       } 
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 

      } 
     }); 
    } 
}); 
+0

Können Sie zeigen, wie Sie die likeCount Variable definieren? – GAlexMES

+0

in POJO ist es bei 0 –

Antwort

1

Dies sollte funktionieren. Sie sollten eine Transaktion verwenden, um einen Wert zu erhöhen oder zu verringern, mit dem mehrere Personen interagieren.

if (dataSnapshot.child(post_key).hasChild(auth.getCurrentUser().getUid())) { 
    Log.i("D Diary", "User has already Liked. So it can be considered as Unliked."); 
    mDatabaseLike.child(post_key).child(auth.getCurrentUser().getUid()).removeValue(); 
    updateCounter(false); 
    mProcessLike = false; 
} else { 
    Log.i("D Diary", "User Liked"); 
    mDatabaseLike.child(post_key).child(auth.getCurrentUser().getUid()).setValue(auth.getCurrentUser().getDisplayName()); 
    updateCounter(true) 
    Log.i(dataSnapshot.getKey(), dataSnapshot.getChildrenCount() + "Count"); 
    mProcessLike = false; 
} 

Mit updateCounter:

private void updateCounter(bool increment) { 
    mDatabaseLikeCount.runTransaction(new Transaction.Handler() { 
     @Override 
     public Transaction.Result doTransaction(MutableData mutableData) { 
      if (mutableData.getValue() != null) { 
       int value = mutableData.getValue(Integer.class); 
       if(increment) { 
        value++; 
       } else { 
        value--; 
       } 
       mutableData.setValue(value); 
      } 
      return Transaction.success(mutableData); 
     } 

     @Override 
     public void onComplete(DatabaseError databaseError, boolean b, 
           DataSnapshot dataSnapshot) { 
      // Transaction completed 
      Log.d(TAG, "likeTransaction:onComplete:" + databaseError); 
     } 
    }); 
} 

Firebase Transactions

+0

initialisiert können Sie mir bitte helfen, wo ich meinen Update-Zähler setzen? –

+0

Nur irgendwo in der gleichen Klasse wie der Code, den Sie gepostet haben. –

+0

Hast du es zur Arbeit gebracht? –