I am beginner and I am working on an android Project where users like the post that admin posts for them. The likes are updated to firebase when user clicks on the like button. The Issue is even though the user likes or unlikes the post, the likes count is increasing. Please look into it.
Note:
Log.d(TAG, "Liked onDataChange: "+isLiked);
returns false no matter if we like or unlike the shinebutton. Shinebutton is a library.
Link to its GitHub : Shinebutton Github
onLike Method:
@Override
public void onLike(View v, int position) {
UploadImage selectedItem = mUploads.get(position);
String selectedKey = selectedItem.getKey();
final ShineButton shineButton = new ShineButton(Objects.requireNonNull(getActivity()));
shineButton.setBtnFillColor(RED);
shineButton.setShapeResource(R.raw.heart);
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(100,100);
shineButton.setLayoutParams(layoutParams);
final DatabaseReference likesRef = FirebaseDatabase.getInstance().getReference().child("ImageUploads").child(selectedKey).child("likes");
likesRef.addListenerForSingleValueEvent(new ValueEventListener(){
@Override
public void onDataChange(@NotNull DataSnapshot dataSnapshot) {
long numLikes = 0;
if(dataSnapshot.exists()){
numLikes = dataSnapshot.getValue(Long.class);
}
boolean isLiked = shineButton.isSelected();
Log.d(TAG, "Liked onDataChange: "+isLiked);
if(isLiked){
//If already liked then user wants to unlike the post
likesRef.setValue(numLikes-1);
}else {
//If not liked already then user wants to like the post
likesRef.setValue(numLikes+1);
shineButton.setEnabled(false);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
ShineButton like = layout.findViewById(R.id.like_feed);
System.out.println(RED);
like.setBackground(getResources().getDrawable(R.drawable.like_feed_bg));
}
After the modification of the Code: Now eventhough we like or unlike the count is not increasing or decreasing.
Onlike Method:
public void onLike(View v, int position) {
UploadImage selectedItem = mUploads.get(position);
String selectedKey = selectedItem.getKey();
final ShineButton shineButton = new ShineButton(Objects.requireNonNull(getActivity()));
shineButton.setBtnFillColor(RED);
shineButton.setShapeResource(R.raw.heart);
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(100,100);
shineButton.setLayoutParams(layoutParams);
final DatabaseReference likesRef = FirebaseDatabase.getInstance().getReference().child("ImageUploads").child(selectedKey).child("likes");
likesRef.addListenerForSingleValueEvent(new ValueEventListener(){
@Override
public void onDataChange(@NotNull final DataSnapshot dataSnapshot) {
long numLikes = 0;
if(dataSnapshot.exists()){
numLikes = dataSnapshot.getValue(Long.class);
}
final long finalNumLikes = numLikes;
shineButton.setOnCheckStateChangeListener(new ShineButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(View view, boolean checked) {
if (checked){
likesRef.setValue(finalNumLikes-1);
}
else{
likesRef.setValue(finalNumLikes+1);
}
}
});
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
ShineButton like = layout.findViewById(R.id.like_feed);
System.out.println(RED);
like.setBackground(getResources().getDrawable(R.drawable.like_feed_bg));
}
The problem is that you do not check the state of the button being pressed. You can achieve this by doing the following:
Replace:
if(isLiked){
//If already liked then user wants to unlike the post
likesRef.setValue(numLikes-1); }
else {
//If not liked already then user wants to like the post
likesRef.setValue(numLikes+1);
shineButton.setEnabled(false);
}
With this:
shineButton.setOnCheckStateChangeListener(new ShineButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(View view, boolean checked) {
if (checked){
likesRef.setValue(numLikes+1);
} else {
likesRef.setValue(numLikes-1);
}
}
});
You will also have to keep reference of the botton for when you close the application. You can do this using SharedPreferences
.