如何对传入和传出的聊天消息使用不同的布局

时间:2021-06-28 21:07:22

标签: java android android-recyclerview android-room android-viewholder

我有一个消息设计。 2个xml文件负责设计:

int rV;
if ( (p-1) % rV == 0 && rV % ( (p-1) / rV ) == 1 && rV % (q-1) == 1 )
  tbKr.Text = rV.ToString();
rV = Convert.ToInt32(tbKr.Text);

看起来像这样:

enter image description here

消息存储在 recyclerview_item_incoming.xml recyclerview_item_outgoing.xml 中。 RecyclerView 通过 RecyclerView -> LiveData 连接到 SQLite。 More Info

为了使用 RecyclerView,我有 2 个类:

MessageListAdapter:

Room

MessageViewHolder:

package com.mardaunt.telesupp.recyclerview;

import android.view.ViewGroup;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.DiffUtil;
import androidx.recyclerview.widget.ListAdapter;

import com.mardaunt.telesupp.room.Message;

public class MessageListAdapter extends ListAdapter<Message, MessageViewHolder> {

    public static int idMessage = 0; // I added that
    public static int countMessages = 0; // I added that

    public MessageListAdapter(@NonNull DiffUtil.ItemCallback<Message> diffCallback) {
        super(diffCallback);
    }

    @Override
    public MessageViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        countMessages = getItemCount();
        //System.out.println(countMessages + " - This countMessages\n" + idMessage + "- This idMessage; " + viewType + " - viewType");
        System.out.println(idMessage);
        //if(idMessage >= countMessages) idMessage = 0;
        // I need to pass the create index method of the current message.!!!!!!!!!!
        // The getItem() function returns a Message object.
        return MessageViewHolder.create(parent, getItem(idMessage));
    }

    @Override
    public void onBindViewHolder(MessageViewHolder holder, int position) {
        Message current = getItem(position);
        //System.out.println(current.getId() + " " + current.getPhone() + " " + current.getText());
        holder.bind(current.getPhone() ,current.getText()); // Бинтим только тело телефон и сообщение!
        idMessage = position+1;
        if(idMessage >= countMessages) idMessage = 0;
    }

    public static class MessageDiff extends DiffUtil.ItemCallback<Message> {

        @Override
        public boolean areItemsTheSame(@NonNull Message oldItem, @NonNull Message newItem) {
            return oldItem == newItem;
        }

        @Override
        public boolean areContentsTheSame(@NonNull Message oldItem, @NonNull Message newItem) {
            return oldItem.getText().equals(newItem.getText());
        }
    }
}

消息:

package com.mardaunt.telesupp.recyclerview;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.recyclerview.widget.RecyclerView;

import com.mardaunt.telesupp.R;
import com.mardaunt.telesupp.room.Message;

class MessageViewHolder extends RecyclerView.ViewHolder {
    private final TextView phoneItemView;
    private final TextView messageItemView;

    private MessageViewHolder(View itemView) {
        super(itemView);
        messageItemView = itemView.findViewById(R.id.text_view_message);
        phoneItemView = itemView.findViewById(R.id.text_view_phone);
    }

    public void bind(String phone, String message) {
        phoneItemView.setText(phone);
        messageItemView.setText(message);
    }

        //The method decides which design to choose for the message bubble.
    static MessageViewHolder create(ViewGroup parent, Message current) {
        View view;
        if (current.getNature().equals("outgoing"))
            view = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.recyclerview_item_outgoing, parent, false);
        else view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.recyclerview_item_incoming, parent, false);
        return new MessageViewHolder(view);
    }
}

问题: 我希望传入的消息位于左侧。外发消息位于右侧。 为此,我稍微更改了 package com.mardaunt.telesupp.room; import androidx.annotation.NonNull; import androidx.room.Entity; import androidx.room.PrimaryKey; @Entity(tableName = "messages_table") public class Message { @PrimaryKey(autoGenerate = true) private int id; private String phone; private String text; private String nature; public Message(int id, @NonNull String phone, @NonNull String text, @NonNull String nature ) { this.id = id; this.phone = phone; this.text = text; this.nature = nature; // incoming OR outgoing } public int getId(){return this.id;} public String getPhone(){return this.phone;} public String getText(){return this.text;} public String getNature(){return this.nature;} } 类的静态方法:

MessageViewHolder

但问题是我不知道如何正确地将 Message 对象传递给这个方法? 如您所见,我尝试在 //The method decides which design to choose for the message bubble. static MessageViewHolder create(ViewGroup parent, Message current) { View view; if (current.getNature().equals("outgoing")) view = LayoutInflater.from(parent.getContext()) .inflate(R.layout.recyclerview_item_outgoing, parent, false); else view = LayoutInflater.from(parent.getContext()) .inflate(R.layout.recyclerview_item_incoming, parent, false); return new MessageViewHolder(view); } 类中传递 Message 对象:

MessageListAdapter

我添加了 2 个静态变量(idMessage、countMessages),但这不起作用。 如何为方法 @Override public MessageViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { countMessages = getItemCount(); // I need to pass the create index method of the current message.!!!!!!!!!! // The getItem() function returns a Message object. return MessageViewHolder.create(parent, getItem(idMessage)); } @Override public void onBindViewHolder(MessageViewHolder holder, int position) { Message current = getItem(position); holder.bind(current.getPhone() ,current.getText()); // Бинтим только тело телефон и сообщение! idMessage = position+1; if(idMessage >= countMessages) idMessage = 0; } 添加 Message 对象?

GitHub 上的项目:https://github.com/MinorityMeaning/HelloApp

1 个答案:

答案 0 :(得分:2)

getItemViewType() 是确定项目布局的正确位置。所以你需要把逻辑移到那里,所以在适配器中覆盖它:

@Override
public int getItemViewType(int position) {
    if (getItem(position).getNature().equals("outgoing"))
        return R.layout.recyclerview_item_outgoing;
    else
        return R.layout.recyclerview_item_incoming;
}

这反映在 viewTypeonCreateViewHolder() 参数中,因此它为当前项目保留了正确的布局。所以你要把它传递给 ViewHolder:

@Override
public MessageViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    return MessageViewHolder.create(parent, viewType);
}

在 ViewHolder 中将其设置为您的布局:

static MessageViewHolder create(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext())
            .inflate(viewType, parent, false);
    return new MessageViewHolder(view);
}
相关问题