Как установить элемент списка справа при отправке сообщения?

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

У меня есть два файла макета:

У меня есть этот оператор if в моем MessageAdapter. класс:

 if (convertView == null) {
    convertView = ((Activity) getContext()).getLayoutInflater().inflate(R.layout.item_message_right_admin, parent, 
 }

Это скриншот моего приложения:

введите здесь описание изображения

Я видел один сообщение о переполнении стека, касающееся той же проблемы. Я нашел подсказку, но я не могу ее реализовать. Может ли кто-нибудь предложить мне сделать это? Следующее является подсказкой. Итак, всякий раз, когда пользователь нажимает кнопку отправки, его сообщение должно быть справа. Входящие сообщения должны быть слева.

if (convertView == null) {
        if (list.get(position).getTypeOfSms().equals("send"))
            convertView     = myInflater.inflate(R.layout.raw_left, null);
        else
            convertView     = myInflater.inflate(R.layout.raw_right, null);

Что нужно сделать, чтобы выровнять отправленное сообщение вправо, когда пользователь нажимает кнопку отправки?


person coderpc    schedule 28.04.2017    source источник


Ответы (1)


Измените код адаптера следующим образом:

import android.app.Activity;
import android.content.Context;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.List;


public class MessageAdapter extends ArrayAdapter<Message> {


    private static final int ROW_TYPE_LEFT = 0;
    private static final int ROW_TYPE_RIGHT = 1;

    private List<Message> messagesList;

    public MessageAdapter(Context context, int resource, List<Message> objects) {
        super(context, resource, objects);
        this.messagesList = objects;
    }

    @Override
    public int getViewTypeCount() {
        return 2;
    }

    @Override
    public int getItemViewType(int pos) {
        return messagesList.get(pos).isDelivered() ? ROW_TYPE_LEFT : ROW_TYPE_RIGHT ;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
          // Gets the message that we are displaying at a position
        Message message = getItem(position);

        Log.d("TAG", "message: " + message);

        // Check if an existing view is being reused, otherwise inflate the view
        if (convertView == null) {
            int rowType = getItemViewType(position);
            switch (rowType)
            {
                case ROW_TYPE_RIGHT:
                    convertView = ((Activity) getContext()).getLayoutInflater().inflate(R.layout.item_message_right_admin, parent, false);
                    break;
                case ROW_TYPE_LEFT:
                    convertView = ((Activity) getContext()).getLayoutInflater().inflate(R.layout.item_message_left_user, parent, false);
                    default:
            }

        }

        // Lookup view for data population
        ImageView photoImageView = (ImageView) convertView.findViewById(R.id.photoImageView);
        TextView messageTextView = (TextView) convertView.findViewById(R.id.messageTextView);
        TextView authorTextView = (TextView) convertView.findViewById(R.id.nameTextView);

        boolean isPhoto = message.getPhotoUrl() != null;

        if (isPhoto) {
            messageTextView.setVisibility(View.GONE);
            photoImageView.setVisibility(View.VISIBLE);
            Glide.with(photoImageView.getContext())
                    .load(message.getPhotoUrl())
                    .into(photoImageView);
        } else {
            messageTextView.setVisibility(View.VISIBLE);
            photoImageView.setVisibility(View.GONE);
            messageTextView.setText(message.getText());
        }

        authorTextView.setText(message.getName());

        // Return the completed view to render on screen
        return convertView;
    }

}

и добавьте метод isDelivered в модель Message.

person Krish    schedule 28.04.2017
comment
Ценить это. Метод isDelivered() возвращает логическое значение, которое я должен добавить в класс Message? - person coderpc; 28.04.2017
comment
@ПК. да ИЛИ ваша логика, чтобы найти статус сообщения - person Krish; 28.04.2017
comment
java.lang.NullPointerException: Attempt to invoke interface method 'java.lang.Object java.util.List.get(int)' on a null object reference at com.pc.wecare.MessageAdapter.getItemViewType(MessageAdapter.java:34) Я получил это исключение, когда попробовал ваш код. Не могли бы вы сказать мне, где я ошибся. Я обновил свой класс Message, как вы сказали. - person coderpc; 28.04.2017
comment
Я добавил этот метод в свой Message класс - public boolean isDelivered(){ return true; } - person coderpc; 28.04.2017
comment
Криш, теперь приложение не вылетает, но я вижу тот же вид, что и на картинке выше. Никаких изменений не произошло! каким должен быть мой isDelivered() метод? то, что я упомянул, нормально или мне нужно это изменить? Рад, что у вас есть время ответить на мои вопросы. @Криш - person coderpc; 28.04.2017
comment
@ПК. Какую логику вы используете, чтобы определить, отправлено сообщение или нет? Этот статус должен возвращаться в методе isDelivered(). - person Krish; 28.04.2017
comment
Давайте продолжим это обсуждение в чате. - person coderpc; 28.04.2017
comment
Он такой щедрый и то, как он был рядом со мной, пока моя проблема не была решена. Благодарю за терпение и постоянную поддержку! @Криш - person coderpc; 29.04.2017
comment
Криш, мне нужна твоя помощь в решении этой проблемы Загрузка изображений из firebase происходит медленно. - person coderpc; 01.05.2017
comment
Криш, пожалуйста, зайди в наш чат, если это возможно. Нужна ваша небольшая помощь в решении этой проблемы @Krish - person coderpc; 03.05.2017
comment
Криш, пожалуйста, зайди в наш чат выше! у меня есть одно сомнение @Krish - person coderpc; 09.05.2017