PostAdapter возвращает неправильные посты для сообщений - PullRequest
0 голосов
/ 07 февраля 2020

Введен некоторый код, который заставляет мои PostAdapter возвращать неправильные postid, когда я его регистрирую, а post не нравится ... Я не уверен, как это исправить. Приложение не создает sh или что-то еще, но я не уверен, как это исправить.

Сообщение имеет три ImageViews, и при нажатии на них они меняют цвет. Раньше это происходило так, как и предполагалось, но теперь оно не работает ... Приложение не создает sh, как я уже сказал, но когда я регистрирую его, я получаю неправильный postid.

Лайки не сохраняются для исправления постов, а комментарии не записываются.

Может кто-нибудь посоветовать мне, почему это происходит?

PostAdapter

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

                }
            });
        }

    }

Ответы [ 2 ]

1 голос
/ 07 февраля 2020

Проблема в

public Post post;

Всякий раз, когда отображается строка, ей присваивается ее значение. Когда пользователь нажимает на другую строку, адаптер все еще использует эту запись для получения идентификатора.

Просто избавьтесь от должности и используйте позицию, чтобы получить доступ к элементу, который пользователь только что нажал.

1 голос
/ 07 февраля 2020

Это потому, что вы используете настройку прослушивателя щелчков в onbind, которая перезапишет предыдущий прослушиватель щелчков, поэтому сообщение в этом прослушивателе щелчков никогда не будет синхронизировано правильно. Вместо этого вы должны переместить своих слушателей кликов в видоискатель. Или легко исправить это использовать getItem (viewholder.adapterPosition) в слушателе кликов

...