Java 表示“喜欢”和“不喜欢”的ImageView不会更改颜色,也不会在Firebase中创建新节点
我想在我的项目中加入一个喜欢的和不喜欢的Java 表示“喜欢”和“不喜欢”的ImageView不会更改颜色,也不会在Firebase中创建新节点,java,android,json,Java,Android,Json,我想在我的项目中加入一个喜欢的和不喜欢的ImageView,就像Youtube在评论部分所做的那样。选择后,它们将颜色从黑色变为红色,并且只能选择一种。你不能喜欢或不喜欢一个评论,显然,它必须是一个或另一个 我目前拥有Firebase的方式如下:当有人在帖子上发表评论时,评论会被保存,JSON看起来是这样的comments>PostId>CommentId>Publisher,Comment,CommentId。我想检查commentId是否存在,如果存在,那么我想在根节点下创建一个新节点,如下
ImageView
,就像Youtube在评论部分所做的那样。选择后,它们将颜色从黑色变为红色,并且只能选择一种。你不能喜欢或不喜欢一个评论,显然,它必须是一个或另一个
我目前拥有Firebase的方式如下:当有人在帖子上发表评论时,评论会被保存,JSON看起来是这样的comments>PostId>CommentId>Publisher,Comment,CommentId
。我想检查commentId
是否存在,如果存在,那么我想在根节点下创建一个新节点,如下所示:Comments Likes Dislikes>commentId>Likes,Dislikes>UserId:true
(取决于他们选择的like或dislike)
我的代码没有像
那样将变为红色,也没有创建新节点。不确定我在这里缺少了什么。有人能告诉我,我对这一点的想法是否正确,以及我的代码中的错误,为什么ImageView
没有从黑色变为红色k
不知道为什么我在这件事上有这么多麻烦…我是不是在想逻辑错误?有没有更好的办法
CommentAdapter
@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\u Dislikes”。每当用户喜欢或不喜欢注释时,将“Likes\u Dislikes”下的另一个节点作为注释id。
在该节点下,创建两个名为“喜欢”和“不喜欢”的节点,并根据其操作将用户id放在该节点下
总而言之,您的数据库结构应该如下所示
我为什么要提出这个建议?
正如您所见,Fire base会在引用父节点时下载所有子节点。这意味着,当您的评论的喜欢/不喜欢增加时,您的单个评论节点会增加。想象一下,一篇文章有120条评论,每个评论都有120条喜欢和不喜欢的内容,加载速度会变慢
因此,最好将好恶记录到另一个单独的节点中。
让我知道你的想法。这是我的建议
将根节点下的节点命名为“Likes\u Dislikes”。每当用户喜欢或不喜欢注释时,将“Likes\u Dislikes”下的另一个节点作为注释id。
在该节点下,创建两个名为“喜欢”和“不喜欢”的节点,并根据其操作将用户id放在该节点下
总而言之,您的数据库结构应该如下所示
我为什么要提出这个建议?
正如您所见,Fire base会在引用父节点时下载所有子节点。这意味着,当您的评论的喜欢/不喜欢增加时,您的单个评论节点会增加。想象一下,一篇文章有120条评论,每个评论都有120条喜欢和不喜欢的内容,加载速度会变慢
因此,最好将好恶记录到另一个单独的节点中。
让我知道你的想法。我上传了代码,但仍然没有得到正确的结果。正在创建“喜欢不喜欢的评论”节点,其结构为
喜欢的评论>喜欢的评论>喜欢的评论>用户ID:true
,但是如果我不喜欢该评论,则该值不会被删除……我做错了什么?你仍然面临着问题吗问题?我成功了,兄弟,非常感谢。你帮了很多忙:)一件事,我上传了另一个问题,因为我想如果用户点击了喜欢的图像视图,他就不能同时点击不喜欢的图像视图。他只能选择其中一个。如果他选择了一个,另一个就不选择自己。也许你知道我该怎么做?让我看看我上传的代码,但我仍然没有得到正确的结果。正在创建Comment Likes Dislikes节点,其结构为Comment Likes Dislikes>CommentId>Likes>UserId:true
,但如果我不喜欢该注释,则不会删除该值。。。我做错了什么?你还面临这个问题吗?我成功了,兄弟,非常感谢。你帮了很多忙:)一件事,我上传了另一个问题,因为我想如果用户点击了喜欢的ImageView,他就不能同时点击不喜欢的ImageView。他只能选择其中一个。如果他选择了一个,另一个就不选择自己。也许你知道我该怎么做?让我看看