Изменения элементов списка при прокрутке в Android. Как этого избежать?

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

Adaptar:

     @Override
public View getView(int position, View convertView, ViewGroup parent) {
    if (convertView == null) {
        convertView = ((Activity) getContext()).getLayoutInflater().inflate(R.layout.item_message, parent, false);
    }
        ImageView photoImageView = (ImageView) convertView.findViewById(R.id.photoImageView);
        TextView messageTextView = (TextView) convertView.findViewById(R.id.messageTextView);
        TextView authorTextView = (TextView) convertView.findViewById(R.id.nameTextView);
        LinearLayout layout = (LinearLayout) convertView.findViewById(R.id.image_container);
        FriendlyMessage message = getItem(position);
        boolean isPhoto = message.getPhotoUrl() != null;
        if (isPhoto) {
            messageTextView.setVisibility(View.GONE);
            layout.setVisibility(View.VISIBLE);
            layout.setMinimumHeight(200);
            photoImageView.setVisibility(View.VISIBLE);
            Glide.with(photoImageView.getContext())
                    .load(message.getPhotoUrl())
                    .into(photoImageView);
        } else {
            messageTextView.setVisibility(View.VISIBLE);
            photoImageView.setVisibility(View.GONE);
            layout.setVisibility(View.GONE);
            layout.setMinimumHeight(0);
            messageTextView.setText(message.getText());
        }


        messageTextView.setText(message.getText());
        authorTextView.setText("." + message.getName());


    return convertView;

Но я хочу, чтобы у пользователей были собственные сообщения в правой части, поэтому написал код, который выделен жирным шрифтом ниже, он отлично работает сначала и после прокрутки все сдвиги вправо... попытался переопределить getviewcounttype, но не может быть реализован должным образом... Любые решения для изменения код или для предотвращения смещения элементов..

Это изображение сначала работает нормально

При прокрутке все перемещается вправо

Это код для вышеуказанных изменений

     @Override
public View getView(int position, View convertView, ViewGroup parent) {
    if (convertView == null) {
        convertView = ((Activity) getContext()).getLayoutInflater().inflate(R.layout.item_message, parent, false);
    }
        ImageView photoImageView = (ImageView) convertView.findViewById(R.id.photoImageView);
        TextView messageTextView = (TextView) convertView.findViewById(R.id.messageTextView);
        TextView authorTextView = (TextView) convertView.findViewById(R.id.nameTextView);
        LinearLayout layout = (LinearLayout) convertView.findViewById(R.id.image_container);
        FriendlyMessage message = getItem(position);
        boolean isPhoto = message.getPhotoUrl() != null;
        if (isPhoto) {
            messageTextView.setVisibility(View.GONE);
            layout.setVisibility(View.VISIBLE);
            layout.setMinimumHeight(200);
            photoImageView.setVisibility(View.VISIBLE);
            Glide.with(photoImageView.getContext())
                    .load(message.getPhotoUrl())
                    .into(photoImageView);
        } else {
            messageTextView.setVisibility(View.VISIBLE);
            photoImageView.setVisibility(View.GONE);
            layout.setVisibility(View.GONE);
            layout.setMinimumHeight(0);
            messageTextView.setText(message.getText());
        }
        //Modified part to displaying messages on right
        try {
            if (user.getDisplayName().equalsIgnoreCase(message.getName())) {
                System.out.println("At Gravity" + user.getDisplayName().toString() + message.getName());
               messageTextView.setGravity(Gravity.RIGHT);
                authorTextView.setGravity(Gravity.RIGHT);
                layout.setGravity(Gravity.RIGHT);
                messageTextView.setMaxWidth(200);
             authorTextView.setTextColor(Color.CYAN);
            }
        } catch (NullPointerException e) {
            System.out.println("Exception catched");
        }
        messageTextView.setText(message.getText());
        authorTextView.setText("." + message.getName());


    return convertView;

Любое возможное решение этой проблемы???

2 ответа

Пожалуйста, используйте setTag() и getTag() в вашем адаптере, но лучше использовать RecyclerView вместо ListView,

Вы должны добавить оператор else, так как ListView повторно использует его itemviews. Как только вы установите вид вправо, он не сможет самостоятельно изменить свое выравнивание назад влево.

if (user.getDisplayName().equalsIgnoreCase(message.getName())) {
    System.out.println("At Gravity" + user.getDisplayName().toString() + message.getName());
    messageTextView.setGravity(Gravity.RIGHT);
    authorTextView.setGravity(Gravity.RIGHT);
    layout.setGravity(Gravity.RIGHT);
    messageTextView.setMaxWidth(200);
    authorTextView.setTextColor(Color.CYAN);
}else{
    messageTextView.setGravity(Gravity.LEFT);
    authorTextView.setGravity(Gravity.LET);
    layout.setGravity(Gravity.LEFT);
    messageTextView.setMaxWidth(200);
    authorTextView.setTextColor(Color.CYAN);
}
Другие вопросы по тегам