java - 在用户聊天活动中组织消息
问题描述
我为我的应用程序创建了一个自定义视图持有者,以将发送的消息定位在右侧,并将接收到的消息定位在左侧,这是有效的。
当消息被发送或接收时,它们按预期定位,但当聊天活动关闭并重新打开时,发送和接收的消息都位于左侧并赋予相同的颜色。
即使应用程序关闭并重新打开,我怎样才能使其保持原样?
下面是我的MessageAdapter.java
public class MessageAdapter extends RecyclerView.Adapter {
private static final int VIEW_TYPE_MESSAGE_SENT = 1;
private static final int VIEW_TYPE_MESSAGE_RECEIVED = 2;
private FirebaseAuth mAuth;
private Context mContext;
private List<Messages> mMessageList;
public MessageAdapter(List<Messages> mMessageList) {
//mContext = context;
this.mMessageList = mMessageList;
}
@Override
public int getItemCount() {
return mMessageList.size();
}
// Determines the appropriate ViewType according to the sender of the message.
@Override
public int getItemViewType(int i) {
mAuth = FirebaseAuth.getInstance();
String current_user_id = mAuth.getCurrentUser().getUid();
Messages c = mMessageList.get(i);
String from_user = c.getFrom();
String message_type = c.getType();
if (from_user == (current_user_id)) {
return VIEW_TYPE_MESSAGE_SENT;
} else {
return VIEW_TYPE_MESSAGE_RECEIVED;
}
}
// Inflates the appropriate layout according to the ViewType.
@Override
public RecyclerView.ViewHolder onCreateViewHolder (ViewGroup parent,int viewType){
View view;
if (viewType == VIEW_TYPE_MESSAGE_SENT) {
view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_message_sent, parent, false);
return new SentMessageHolder(view);
} else if (viewType == VIEW_TYPE_MESSAGE_RECEIVED) {
view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_message_received, parent, false);
return new ReceivedMessageHolder(view);
}
return null;
}
// Passes the message object to a ViewHolder so that the contents can be bound to UI.
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int i) {
Messages c = mMessageList.get(i);
switch (holder.getItemViewType()) {
case VIEW_TYPE_MESSAGE_SENT:
((SentMessageHolder) holder).bind(c);
break;
case VIEW_TYPE_MESSAGE_RECEIVED:
((ReceivedMessageHolder) holder).bind(c);
}
}
private class SentMessageHolder extends RecyclerView.ViewHolder {
TextView messageText, timeText;
SentMessageHolder(View itemView) {
super(itemView);
messageText = (TextView) itemView.findViewById(R.id.text_message_body);
timeText = (TextView) itemView.findViewById(R.id.text_message_time);
}
void bind(Messages message) {
messageText.setText(message.getMessage());
// Format the stored timestamp into a readable String using method.
// timeText.setText(Utils.formatDateTime(message.getCreatedAt()));
}
}
private class ReceivedMessageHolder extends RecyclerView.ViewHolder {
TextView messageText, timeText, nameText;
ImageView profileImage;
ReceivedMessageHolder(View itemView) {
super(itemView);
messageText = (TextView) itemView.findViewById(R.id.text_message_body);
timeText = (TextView) itemView.findViewById(R.id.text_message_time);
}
void bind(Messages message) {
messageText.setText(message.getMessage());
}
}
}
和我的ChatActivity.java
LayoutInflater inflater = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View action_bar_view = inflater.inflate(R.layout.child_custom_layout,null);
actionBar.setCustomView(action_bar_view);
mTitleView = findViewById(R.id.custom_bar_title);
mLastSeenView = findViewById(R.id.custom_bar_seen);
mProfileImage = findViewById(R.id.custom_appbar_image);
mChatAddBtn = findViewById(R.id.chat_add_btn);
mChatSendBtn = findViewById(R.id.chat_send_btn);
mChatMessageView = findViewById(R.id.chat_message_view);
mChatAddBtn.setVisibility(View.INVISIBLE);
mChatAddBtn.setEnabled(false);
mTitleView.setText(userName);
mAdapter = new MessageAdapter(messagesList);
mMessagesList = findViewById(R.id.messages_list);
mRefreshLayout = findViewById(R.id.message_swipe_layout);
mLinearLayout = new LinearLayoutManager(this);
mMessagesList.setHasFixedSize(true);
mMessagesList.setLayoutManager(mLinearLayout);
mMessagesList.setAdapter(mAdapter);
// loadMessages();
mImageStorage = FirebaseStorage.getInstance().getReference();
mRootRef.child("Chat").child(mCurrentUserId).child(mChatUser).child("seen").setValue(true);
loadMessages();
解决方案
这是代码中的问题
if (from_user == (current_user_id)) {
return VIEW_TYPE_MESSAGE_SENT;
} else {
return VIEW_TYPE_MESSAGE_RECEIVED;
}
您正在使用==检查等效性。这不是检查字符串等效性的正确方法。如果要检查等效性,则需要调用字符串的equals()方法,如下面的代码中所述。
if (from_user.equals(current_user_id)) {
return VIEW_TYPE_MESSAGE_SENT;
} else {
return VIEW_TYPE_MESSAGE_RECEIVED;
}
尝试这个。希望这会帮助你。
推荐阅读
- javascript - 如何将html循环中的模板变量发送到javascript?
- excel - Excel 将行转换为重复列
- sql - SQL Server - 获取去年平均值、当年月平均值和当年总平均值
- javascript - 一个接一个地调用ajax调用-对点击功能做出反应
- groovy - Java 应用程序需要很长时间才能执行预编译的 Groovy 脚本
- nativescript - 工作线程和主线程的共享本机实例
- typescript - 如何使用带有打字稿定义的谷歌地图?
- spring-cloud-stream - 通过 JdbcLockRegistry 自动缩放组中的 Spring Cloud Stream Kinesis Group
- python - Python 类型提示兼容性
- c# - ORA-00904 带有 linq 查询的偶尔无效标识符