Search code examples
javaandroidfirebasepostssocial-likes

Confused with Likes Counter using Firebase in Android


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

        }

Solution

  • 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.