【问题标题】:Confused with Likes Counter using Firebase in Android在 Android 中使用 Firebase 对 Likes Counter 感到困惑
【发布时间】:2021-03-05 04:11:52
【问题描述】:

我是初学者,我正在开发一个 android 项目,用户喜欢管理员为他们发布的帖子。当用户点击喜欢按钮时,喜欢的内容会更新到 firebase。问题是即使用户喜欢或不喜欢该帖子,喜欢的数量仍在增加。请仔细查看。

注意:

Log.d(TAG, "Liked onDataChange: "+isLiked);

无论我们喜欢还是不喜欢shinebutton,都返回false。 Shinebutton 是一个库。

链接到它的 GitHub: Shinebutton Github

onLike 方法:

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

        }

修改代码后:现在,即使我们喜欢或不喜欢,计数也不会增加或减少。

类似方法:

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

        }

【问题讨论】:

  • 请帮帮我。
  • Log.d(TAG, "Liked onDataChange: "+isLiked); 在你喜欢的时候会返回 false 吗?
  • Yes.. 当我们不喜欢它时它返回 false。
  • 如果它返回false,那么您将继续添加新的like。尝试将其更改为if(!isLiked)
  • 当我们不喜欢或喜欢它时 boolean isLiked = shinebutton.isSelected();返回总是假的。怎么办?

标签: java android firebase posts social-likes


【解决方案1】:

问题是您没有检查按下按钮的状态。您可以通过执行以下操作来实现此目的:

替换:

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

有了这个:

shineButton.setOnCheckStateChangeListener(new ShineButton.OnCheckedChangeListener() { 
@Override 
    public void onCheckedChanged(View view, boolean checked) { 
        if (checked){
            likesRef.setValue(numLikes+1);
        } else {
            likesRef.setValue(numLikes-1);
        }
    } 
});

您还必须在关闭应用程序时保留对按钮的引用。您可以使用SharedPreferences 执行此操作。

【讨论】:

  • 答案很好,但问题是它说变量 numLikes 是在内部类中访问的。所以我在全球范围内宣布。现在,即使我们喜欢或不喜欢这个数字也不会改变
  • @UdayKiran 让numLikes 最终确定
  • 我完成了。那么它也不会增加或减少@HB
  • @UdayKiran 你说你让它全球化了,请编辑你的问题并展示它现在的样子。
  • 我把它变成了全局并尝试了......它没有用。然后我把它做成了最终的..它没有用。我将编辑并发布问题。 @HB
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-09
  • 2017-07-27
  • 2016-01-03
相关资源
最近更新 更多