ImageViews меняют цвета при выборе одного из своих «братских» ImageViews - PullRequest
1 голос
/ 15 апреля 2020

У меня проблема в том, что у меня есть comment_item.xml с комментарием пользователя , именем пользователя, лайком и неприязнью и комментарием ImageView, а также TextView для количества комментариев , количество лайков и количество антипатий . Проблема в том, что в сообщении есть, например, 13 комментариев, и мне нравится или не нравится один из комментариев, нажав на ImageView, остальные «моргнут». Под этим я подразумеваю, что в своей Деятельности я сделал так, что когда вы нажимаете, как большой палец, ImageView превращается из серого в красный, а если вы нажимаете не нравится ImageView, он превращается из серого в черный, а затем вы получаете обновленный количество лайков или антипатий рядом. Но когда я нажимаю ImageView за "нравится" или "не нравится", все другие комментарии, как "нравится" или "не нравится" ImageViews также поворачивают другой цвет, затем возвращаются к цвету, в котором они были изначально ... Это как "мерцание", скажем так, так вы, ребята, понимаете, что я имею в виду под происходящим действием.

Как я могу предотвратить это. Любой другой комментарий нравится и не нравится ImageView не должен реагировать, если мне нравится или не нравится другой комментарий ...

Я думаю, что проблема может быть в моем файле xml, но я не 100%. Загрузил картинку, чтобы вы могли видеть пользовательский интерфейс. Теперь, когда я нажимаю на кнопку «Нравится» или «Не нравится» на всех других лайках и антипатиях, «моргание» меняется на противоположный цвет, в котором они находятся, а затем переключается назад… как мигание. Мне нужно, чтобы этого не случилось. Они не должны реагировать, если мне нравится или не нравится другое сообщение ...

enter image description here

comment_item. xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="8dp">

    <de.hdodenhof.circleimageview.CircleImageView
        android:id="@+id/image_profile"
        android:layout_width="40dp"
        android:layout_height="40dp" />

    <LinearLayout
        android:id="@+id/linear_layout_one"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginStart="5dp"
        android:layout_marginBottom="10dp"
        android:layout_toEndOf="@+id/image_profile"
        android:orientation="vertical">

        <TextView
            android:id="@+id/username"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="@color/colorPrimaryAqua50"
            android:textStyle="bold" />

        <TextView
            android:id="@+id/comment"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:maxLines="5" />

    </LinearLayout>

    <LinearLayout
        android:id="@+id/linear_layout_two"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/linear_layout_one"
        android:layout_marginBottom="15dp"
        android:orientation="horizontal">

        <ImageView
            android:id="@+id/icon_thumb_up_grey"
            android:layout_width="18dp"
            android:layout_height="18dp"
            android:layout_marginStart="120dp"
            android:layout_marginTop="5dp"
            android:layout_marginEnd="15dp"
            android:src="@drawable/ic_thumb_up_grey" />

        <ImageView
            android:id="@+id/icon_thumb_up_red"
            android:layout_width="18dp"
            android:layout_height="18dp"
            android:layout_marginStart="120dp"
            android:layout_marginTop="5dp"
            android:layout_marginEnd="15dp"
            android:src="@drawable/ic_thumb_up_red"
            android:visibility="gone" />

        <TextView
            android:id="@+id/comment_likes_number"
            android:layout_width="16sp"
            android:layout_height="16sp"
            android:layout_marginTop="5dp"
            android:layout_marginEnd="15dp" />

        <ImageView
            android:id="@+id/icon_thumb_down_grey"
            android:layout_width="18dp"
            android:layout_height="18dp"
            android:layout_marginTop="5dp"
            android:layout_marginEnd="15dp"
            android:src="@drawable/ic_thumb_down_grey" />

        <ImageView
            android:id="@+id/icon_thumb_down_black"
            android:layout_width="18dp"
            android:layout_height="18dp"
            android:layout_marginTop="5dp"
            android:layout_marginEnd="15dp"
            android:src="@drawable/ic_thumb_down_black"
            android:visibility="gone" />

        <TextView
            android:id="@+id/comment_dislikes_number"
            android:layout_width="16sp"
            android:layout_height="16sp"
            android:layout_marginTop="5dp"
            android:layout_marginEnd="15dp" />

        <ImageView
            android:id="@+id/icon_comment_grey"
            android:layout_width="18dp"
            android:layout_height="18dp"
            android:layout_marginTop="5dp"
            android:layout_marginEnd="15dp"
            android:src="@drawable/ic_comment_grey" />

        <ImageView
            android:id="@+id/icon_comment_blue"
            android:layout_width="18dp"
            android:layout_height="18dp"
            android:layout_marginTop="5dp"
            android:layout_marginEnd="15dp"
            android:src="@drawable/ic_comment_blue"
            android:visibility="gone" />

        <TextView
            android:id="@+id/comment_response_number"
            android:layout_width="16sp"
            android:layout_height="16sp"
            android:layout_marginTop="5dp" />

    </LinearLayout>

</RelativeLayout>

CommentAdapter

       holder.commentLike.setOnClickListener(v -> {

        if (holder.commentLike.getTag().equals("like")) {
            FirebaseDatabase.getInstance().getReference().child("Comment Liked or Disliked").child(comment.getCommentid()).child("Likes").child(mFirebaseUser.getUid()).setValue(true);
            } else {
                FirebaseDatabase.getInstance().getReference().child("Comment Liked or Disliked").child(comment.getCommentid()).child("Likes").child(mFirebaseUser.getUid()).removeValue();
            }

            notifyDataSetChanged();
        });

        holder.commentDislike.setOnClickListener(v -> {

            if (holder.commentDislike.getTag().equals("dislike")) {
                FirebaseDatabase.getInstance().getReference().child("Comment Liked or Disliked").child(comment.getCommentid()).child("Dislikes").child(mFirebaseUser.getUid()).setValue(true);
                Toast.makeText(mContext, "Don't be mean", Toast.LENGTH_SHORT).show();
            } else {
                FirebaseDatabase.getInstance().getReference().child("Comment Liked or Disliked").child(comment.getCommentid()).child("Dislikes").child(mFirebaseUser.getUid()).removeValue();
            }

            notifyDataSetChanged();
        });


    private void commentLike(final String commentid, final ImageView imageView) {
            if (commentid != null) {


   DatabaseReference reference = FirebaseDatabase.getInstance().getReference().child("Comment Liked or Disliked").child(commentid).child("Likes");
            reference.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                    if (mFirebaseUser != null)
                        if (dataSnapshot.child(mFirebaseUser.getUid()).exists()) {
                            imageView.setImageResource(R.drawable.ic_thumb_up_red);
                            imageView.setTag("liked");
                        } else {
                            imageView.setImageResource(R.drawable.ic_thumb_up_grey);
                            imageView.setTag("like");
                        }
                }

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

                }
            });
        }
    }

    private void commentDislike(final String commentid, final ImageView imageView) {
        if (commentid != null) {
            DatabaseReference reference = FirebaseDatabase.getInstance().getReference().child("Comment Liked or Disliked").child(commentid).child("Dislikes");
            reference.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                    if (mFirebaseUser != null)
                        if (dataSnapshot.child(mFirebaseUser.getUid()).exists()) {
                            imageView.setImageResource(R.drawable.ic_thumb_down_black);
                            imageView.setTag("disliked");
                        } else {
                            imageView.setImageResource(R.drawable.ic_thumb_down_grey);
                            imageView.setTag("dislike");
                        }
                }

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

                }
            });
        }
    }

    private void commentLikesNumber(TextView commentLikesNumber, String commentid) {
        DatabaseReference reference = FirebaseDatabase.getInstance().getReference().child("Comment Liked or Disliked").child(commentid).child("Likes");
        reference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                commentLikesNumber.setText(dataSnapshot.getChildrenCount() + "");
            }

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

            }
        });
    }

    private void commentDislikesNumber(TextView commentDislikesNumber, String commentid) {
        DatabaseReference reference = FirebaseDatabase.getInstance().getReference().child("Comment Liked or Disliked").child(commentid).child("Dislikes");
        reference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                commentDislikesNumber.setText(dataSnapshot.getChildrenCount() + "");
            }

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

            }
        });
    }
}

1 Ответ

1 голос
/ 15 апреля 2020

Проблема заключается в том, что вы уведомляете DataSatChanged () вашего адаптера для каждого нажатия кнопки «Нравится / Не нравится», что приводит к обновлению всех изображений всех строк комментариев. Итак, во-первых, избавьтесь от notifyDatasetChanged() в слушателе ниже

    holder.commentLike.setOnClickListener(v -> {

        if (holder.commentLike.getTag().equals("like")) {
            FirebaseDatabase.getInstance().getReference().child("Comments Liked").child(comment.getCommentid()).child(mFirebaseUser.getUid()).setValue(true);
        } else {
            FirebaseDatabase.getInstance().getReference().child("Comments Liked").child(comment.getCommentid()).child(mFirebaseUser.getUid()).removeValue();
        }

        notifyDataSetChanged();
    });

    holder.commentDislike.setOnClickListener(v -> {

        if (holder.commentDislike.getTag().equals("dislike")) {
            FirebaseDatabase.getInstance().getReference().child("Comments Disliked").child(comment.getCommentid()).child(mFirebaseUser.getUid()).setValue(true);
            Toast.makeText(mContext, "Don't be mean", Toast.LENGTH_SHORT).show();
        } else {
            FirebaseDatabase.getInstance().getReference().child("Comments Disliked").child(comment.getCommentid()).child(mFirebaseUser.getUid()).removeValue();
        }

        notifyDataSetChanged();
    });

Во-вторых, вы устанавливаете логическое значение в firebase равным true, когда вы нажимаете кнопку like, и false для кнопки dislike.

Вы можете манипулировать datasnapshot в качестве логического значения в вашем адаптере, приведя его к логическому значению, и если оно истинно, то вы можете установить для изображения красный цвет "как" и "серый" в противном случае.

 private void commentLike(final String commentid, final ImageView imageView) {
    if (commentid != null) {
        DatabaseReference reference = FirebaseDatabase.getInstance().getReference().child("Comments Liked").child(commentid);
        reference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                if (mFirebaseUser != null)
                    if (dataSnapshot.child(mFirebaseUser.getUid()).exists()) {

                        boolean value = (Boolean) dataSnapshot.child((mFirebaseUser.getUid()).getValue();
                        if (value) {
                            imageView.setImageResource(R.drawable.ic_thumb_up_red);
                            imageView.setTag("liked");

                        } else {
                            imageView.setImageResource(R.drawable.ic_thumb_up_grey);
                            imageView.setTag("like");

                        }

                    } else {
                        imageView.setImageResource(R.drawable.ic_thumb_up_grey);
                        imageView.setTag("like");
                    }
            }

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

            }
        });
    }
}

Также сделайте то же самое для метода commentDislike().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...