java - 代表喜欢和不喜欢的 ImageView 不会改变颜色,Firebase 中也不会创建新节点

标签 java android json

我想将喜欢不喜欢ImageView合并到我的项目中,就像YouTube在评论部分中的那样。选择后,它们的颜色会从黑色变为红色,并且只能选择一种。你不能明显地喜欢和不喜欢一条评论,它必须是其中之一。

我目前拥有 Firebase 的方式如下:当有人对帖子发表评论时,评论将被保存,JSON 如下所示 Comments > PostId > CommentId > Publisher, Comment, CommentId 。我想检查 commentId 是否存在,如果存在,那么我想在根节点下创建一个新节点,如下所示: Comments Likes Dislikes > CommentId > Likes, Dislikes > UserId:true(取决于他们选择喜欢不喜欢

我的代码没有将 like ImageView 变成红色,也没有创建新节点。不知道我在这里缺少什么。有人可以告诉我我的想法是否正确,也许我的代码中存在错误,为什么 ImageView 没有从黑色变为红色 onClick.

不知道为什么我在这方面遇到这么多麻烦...我是否考虑了逻辑错误?有更好的办法吗?

enter image description here

评论适配器

@Override


   public void onBindViewHolder(@NonNull final ViewHolder holder, int position) {

        mFirebaseUser = FirebaseAuth.getInstance().getCurrentUser();
        final Comment comment = mComment.get(position);

        commentLike(holder.commentLike);

        holder.commentLike.setOnClickListener(v -> {
            if (holder.commentLike.getTag().equals("like")) {
                FirebaseDatabase.getInstance().getReference().child("Comment Likes Dislikes")
                        .child(comment.getCommentid()).child("Likes").child(mFirebaseUser.getUid()).setValue(true);
            } else {
                FirebaseDatabase.getInstance().getReference().child("Comment Likes Dislikes")
                        .child(comment.getCommentid()).child("Likes").child(mFirebaseUser.getUid()).removeValue();
            }
        });

 public static class ViewHolder extends RecyclerView.ViewHolder {

        ImageView commentLike;

        ViewHolder(@NonNull View itemView) {
            super(itemView);

            commentLike = itemView.findViewById(R.id.icon_thumb_up_black);
        }
    }

 private void commentLike(ImageView imageView) {
        DatabaseReference reference = FirebaseDatabase.getInstance().getReference().child("Comments").child(postid);
        reference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                Comment comment = dataSnapshot.getValue(Comment.class);
                if (comment != null) {
                    if (dataSnapshot.child(comment.getCommentid()).exists()) {
                        imageView.setImageResource(R.drawable.ic_thumb_up_red);
                        imageView.setTag("liked");
                    } else {
                        imageView.setImageResource(R.drawable.ic_thumb_up_black);
                        imageView.setTag("like");
                    }
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });
    }

最佳答案

这是我的建议。

将根节点下的节点命名为“Likes_Dislikes”。每当用户喜欢或不喜欢评论时,都会在“Likes_Dislikes”下创建另一个节点作为评论的 ID。 在该节点下创建了两个名为“喜欢”和“不喜欢”的节点,并根据用户的操作将用户 ID 放在该节点下。

总而言之,您的数据库结构应该如下所示。

Struvcture

我为什么建议这个?

正如您所见,只要引用父节点,Fire-base 就会下载所有子节点。这意味着当您的评论的喜欢/不喜欢增加时,您的单个评论节点也会增加。想象一下,一篇帖子有 120 条评论,每条评论有 120 条喜欢和不喜欢,加载速度会很慢。

因此,最好将喜欢和不喜欢的内容记录到另一个单独的节点中。 让我知道你的想法。

关于java - 代表喜欢和不喜欢的 ImageView 不会改变颜色,Firebase 中也不会创建新节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61179468/

相关文章:

java - 使用 java 的 R arules 包中的问题

java - 将 AIDL 更新到下一个修订版时出错

android - 更改弹出菜单项的文本大小

java - 等于方法崩溃应用程序

javascript - 先加载 JSON

Java:有人可以从 "Thinking in Java 4th edition"解释一下吗?

java - 用于从文件中批量插入项目的 Spring jdbc 编程事务

android - 在 Facebook SDK 中的两个不同的 LoginButtons 中注册相同的回调

python - 无法打开/查看 Yelp 数据集

javascript - 元组数组的 JSON 模式