PostAdapter 为帖子返回不正确的 postid

PostAdapter returning incorrect postids for posts

引入了一些代码,使我的 PostAdapter return 在我登录时变成了错误的 postid,并且 post 没有被点赞...我是不知道如何解决它。应用程序没有崩溃或其他任何问题,但我不确定如何修复它。

Post 有三个 ImageViews,当它们被点击时它们会改变颜色。之前是按预期发生的,但现在它不工作了……应用程序没有崩溃,就像我说的那样,但是当我记录它时,我得到了错误的 postid

没有保存点赞以更正帖子,也没有记录评论。

谁能告诉我为什么会这样?

Post适配器

public class PostAdapter extends RecyclerView.Adapter<PostAdapter.ViewHolder> {

    public Context mContext;
    public List<Post> mPost;

    public Post post;

    private FirebaseUser firebaseUser;

    public PostAdapter(Context mContext, List<Post> mPost) {
        this.mContext = mContext;
        this.mPost = mPost;

    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(mContext).inflate(R.layout.post_item, parent, false);
        return new PostAdapter.ViewHolder(view);

    }

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

        firebaseUser = FirebaseAuth.getInstance().getCurrentUser();
        post = mPost.get(position);

        Glide.with(mContext).load(post.getPostimage())
                .apply(new RequestOptions().placeholder(R.drawable.placeholderimg))
                .into(holder.post_image);

        if ("".equals(post.getDescription())) {
            holder.description.setVisibility(View.GONE);
        } else {
            holder.description.setVisibility(View.VISIBLE);
            holder.description.setText(post.getDescription());
        }

        //Timestamp holder
        if ("".equals(post.getTimestamp())) {
            holder.timestamp.setVisibility(View.GONE);
        } else {
            holder.timestamp.setVisibility(View.VISIBLE);
            String timestampDifference = getTimeDate();
            if (!timestampDifference.equals("0")) {
                holder.timestamp.setText(timestampDifference + " days ago");
            } else {
                holder.timestamp.setText("Today");
            }
        }

        if ("".equals(post.getText_event())) {
            holder.text_event.setVisibility(View.GONE);
        } else {
            holder.text_event.setVisibility(View.VISIBLE);
            holder.text_event.setText(post.getText_event());
        }

        if ("".equals(post.getText_location())) {
            holder.text_location.setVisibility(View.GONE);
        } else {
            holder.text_location.setVisibility(View.VISIBLE);
            holder.text_location.setText(post.getText_location());
        }

        if ("".equals(post.getText_date_time())) {
            holder.text_date_time.setVisibility(View.GONE);
        } else {
            holder.text_date_time.setVisibility(View.VISIBLE);
            holder.text_date_time.setText(post.getText_date_time());
        }

        holder.like.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (holder.like.getTag().equals("like")) {
                    FirebaseDatabase.getInstance().getReference().child("Likes").child(post.getPostid())
                            .child(firebaseUser.getUid()).setValue(true);
                    addNotification(post.getPublisher(), post.getPostid());
                } else {
                    FirebaseDatabase.getInstance().getReference().child("Likes").child(post.getPostid())
                            .child(firebaseUser.getUid()).removeValue();
                }
            }
        });

        publisherInfo(holder.image_profile, holder.username, post.getPublisher());
        attending_event(post.getPostid(), holder.attend_event);
        number_of_people_attending_event(holder.number_of_people_attending_event, post.getPostid());
        getComments(post.getPostid(), holder.number_of_comments);
        getTimeDate();
        isSaved(post.getPostid(), holder.save_event);
        eventLiked(post.getPostid(), holder.like);
        number_of_likes(holder.number_of_likes, post.getPostid());

        holder.image_profile.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SharedPreferences.Editor editor = mContext.getSharedPreferences("PREFS", Context.MODE_PRIVATE).edit();
                editor.putString("profileid", post.getPublisher());
                editor.apply();

                ((FragmentActivity) mContext).getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
                        new ProfileFragment()).commit();
            }
        });

        holder.username.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SharedPreferences.Editor editor = mContext.getSharedPreferences("PREFS", Context.MODE_PRIVATE).edit();
                editor.putString("profileid", post.getPublisher());
                editor.apply();

                ((FragmentActivity) mContext).getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
                        new ProfileFragment()).commit();
            }
        });

        holder.post_image.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SharedPreferences.Editor editor = mContext.getSharedPreferences("PREFS", Context.MODE_PRIVATE).edit();
                editor.putString("postid", post.getPostid());
                editor.apply();

                ((FragmentActivity) mContext).getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
                        new PostDetailFragment()).commit();
            }
        });

        holder.save_event.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (holder.save_event.getTag().equals("save")) {
                    FirebaseDatabase.getInstance().getReference().child("Saves").child(firebaseUser.getUid())
                            .child(post.getPostid()).setValue(true);
                } else {
                    FirebaseDatabase.getInstance().getReference().child("Saves").child(firebaseUser.getUid())
                            .child(post.getPostid()).removeValue();
                }
            }
        });

        //Setting ViewHolder for the attend_event icon (black)
        holder.attend_event.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.d("POSTID", post.getPostid());
                if (holder.attend_event.getTag().equals("attend event")) {
                    FirebaseDatabase.getInstance().getReference().child("Attending Event").child(post.getPostid())
                            .child(firebaseUser.getUid()).setValue(true);
                } else {
                    FirebaseDatabase.getInstance().getReference().child("Attending Event").child(post.getPostid())
                            .child(firebaseUser.getUid()).removeValue();
                }
            }
        });

        holder.comment.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(mContext, CommentsActivity.class);
                intent.putExtra("postid", post.getPostid());
                intent.putExtra("publisherid", post.getPublisher());
                mContext.startActivity(intent);
            }
        });

        holder.number_of_comments.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(mContext, CommentsActivity.class);
                intent.putExtra("postid", post.getPostid());
                intent.putExtra("publisherid", post.getPublisher());
                mContext.startActivity(intent);
            }
        });

        holder.number_of_likes.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(mContext, FollowersActivity.class);
                intent.putExtra("id", post.getPostid());
                intent.putExtra("title", "Likes");
                mContext.startActivity(intent);
            }
        });

        holder.more_options.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                PopupMenu popupMenu = new PopupMenu(mContext, v);
                popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                    @Override
                    public boolean onMenuItemClick(MenuItem item) {
                        switch (item.getItemId()) {
                            case R.id.edit_event:
                                editPost(post.getPostid());
                                return true;
                            case R.id.delete_event:
                                FirebaseDatabase.getInstance().getReference("Posts").child(post.getPostid()).removeValue()
                                        .addOnCompleteListener(new OnCompleteListener<Void>() {
                                            @Override
                                            public void onComplete(@NonNull Task<Void> task) {
                                                if (task.isSuccessful()) {
                                                    Toast.makeText(mContext, "Event deleted", Toast.LENGTH_SHORT).show();
                                                }
                                            }
                                        });
                                return true;
                            case R.id.report_event:
                                Toast.makeText(mContext, "Event has been reported", Toast.LENGTH_SHORT).show();
                                return true;
                            default:
                                return false;
                        }
                    }
                });
                popupMenu.inflate(R.menu.event_menu);
                if (!post.getPublisher().equals(firebaseUser.getUid())) {
                    popupMenu.getMenu().findItem(R.id.edit_event).setVisible(false);
                    popupMenu.getMenu().findItem(R.id.delete_event).setVisible(false);
                }
                popupMenu.show();
            }
        });

    }

    @Override
    public int getItemCount() {
        if (mPost != null) {
            return mPost.size();
        } else {
            return 0;
        }
    }

public class ViewHolder extends RecyclerView.ViewHolder {

        public ImageView image_profile, post_image, like, comment, attend_event, save_event, more_options;
        public TextView username;
        public TextView number_of_likes;
        public TextView description;
        public TextView number_of_comments;
        public TextView text_event;
        public TextView text_location;
        public TextView text_date_time;
        public TextView timestamp;
        public TextView number_of_people_attending_event;

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

            image_profile = itemView.findViewById(R.id.image_profile);
            post_image = itemView.findViewById(R.id.post_image);
            like = itemView.findViewById(R.id.like);
            comment = itemView.findViewById(R.id.comment);
            username = itemView.findViewById(R.id.username);
            number_of_likes = itemView.findViewById(R.id.number_of_likes);
            description = itemView.findViewById(R.id.description);
            number_of_comments = itemView.findViewById(R.id.number_of_comments);
            text_event = itemView.findViewById(R.id.text_event);
            text_location = itemView.findViewById(R.id.text_location);
            text_date_time = itemView.findViewById(R.id.text_date_time);
            attend_event = itemView.findViewById(R.id.attend_event);
            number_of_people_attending_event = itemView.findViewById(R.id.number_of_people_attending_event);
            save_event = itemView.findViewById(R.id.save_event);
            more_options = itemView.findViewById(R.id.more_options);
            timestamp = itemView.findViewById(R.id.timestamp);

            text_location.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(mContext, MapsActivityUser.class);
                    intent.putExtra("postid", mPost.get(getAdapterPosition()).getPostid());
                    intent.putExtra("text_event", mPost.get(getAdapterPosition()).getText_event());
                    intent.putExtra("text_location", mPost.get(getAdapterPosition()).getText_location());
                    intent.putExtra("text_date_time", mPost.get(getAdapterPosition()).getText_date_time());
                    mContext.startActivity(intent);
                }
            });
        }
    }

private void eventLiked(String postid, final ImageView imageView) {
        if (postid != null) {
            final FirebaseUser firebaseUser = FirebaseAuth.getInstance().getCurrentUser();
            DatabaseReference reference = FirebaseDatabase.getInstance().getReference().child("Likes").child(postid);
            reference.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                    if (dataSnapshot.child(firebaseUser.getUid()).exists()) {
                        imageView.setImageResource(R.drawable.ic_event_liked_aqua_fill);
                        imageView.setTag("liked");
                    } else {
                        imageView.setImageResource(R.drawable.ic_favorite_heart_hollow);
                        imageView.setTag("like");
                    }
                }

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

                }
            });
        }

    }

private void isSaved(final String postid, final ImageView imageView) {
        if (firebaseUser.getUid() != null) {
            FirebaseUser firebaseUser = FirebaseAuth.getInstance().getCurrentUser();
            DatabaseReference reference = FirebaseDatabase.getInstance().getReference().child("Saves").child(firebaseUser.getUid());
            reference.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                    if (postid != null) {
                        if (dataSnapshot.child(postid).exists()) {
                            imageView.setImageResource(R.drawable.ic_bookmark_darker_version);
                            imageView.setTag("saved");
                        } else {
                            imageView.setImageResource(R.drawable.ic_save_hollow);
                            imageView.setTag("save");
                        }
                    }

                }

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

                }
            });
        }

    }

这是因为您在 onbind 中设置了点击监听器,它会覆盖之前的点击监听器,因此点击监听器中的 post 永远不会正确同步。您应该将点击监听器移至查看器。或者一个简单的解决方法是在点击监听器中使用 getItem(viewholder.adapterPosition)

问题在

public Post post;

每当呈现一行时,它的值就会分配给这一行。当用户点击另一行时,适配器仍然使用此 post 来获取 id。

只需删除 post 并使用位置访问用户刚刚点击的项目。