【发布时间】:2021-08-15 17:38:27
【问题描述】:
我正在开发一个聊天应用程序,有两种类型的视图,一种用于传入消息,另一种用于传出消息。所以我通过视图类型将它们区分为 0 和 1。所以它工作得很好,但现在我想为日期添加另一个视图作为标题,如 this。因此,为此,我将另一种视图类型设为 2,但它用消息视图替换了它。那么,如何在两个视图之间显示第三个视图?
这就是我创建ViewHolder的方式
override fun onCreateViewHolder(parent: ViewGroup, position: Int): ViewHolder {
return if (position == 1) {
val view = LayoutInflater.from(mContext).inflate(R.layout.item_outgoing_message, parent, false)
ViewHolder(view)
} else if (position == 0) {
val view = LayoutInflater.from(mContext).inflate(R.layout.item_incoming_message, parent, false)
ViewHolder(view)
} else {
val view = LayoutInflater.from(mContext).inflate(R.layout.item_show_time_chat, parent, false)
ViewHolder(view)
}
}
这是我区分ViewType的方式
override fun getItemViewType(position: Int): Int {
return if (mChatList[position].getSender() == currentUserID) {
1
}
else if (mChatList[position].getMessageDate() == getTheRecentMessageDate(position)){
2
}
else {
0
}
}
这是为了获取日期之间的差异
private fun getTheRecentMessageDate(position: Int): String {
val lastMessagePosition = position - 1
//return the 1st message if messages chat thread is empty
val chat = mChatList[if (lastMessagePosition <= 0) 0 else lastMessagePosition]
//get and return the sender of the last message
return chat.getMessageDate()
}
最后应用到BindViewHolder
if (mChatList[position].getMessageDate() == getTheRecentMessageDate(position)){
holder.showDateTv?.text = getTheRecentMessageDate(position)
}
【问题讨论】:
-
您可能会发现将“消息日期”视图作为发件人消息布局的一部分更容易...这将启用您的
mChatList和回收站行之间的一对一映射 -
@CSmith 我知道并且我已经尝试过了,但是当我滑动消息回复时,日期视图也会随之滑动。
-
您的适配器需要表示您的聊天消息(例如 2 行)到您的 Recycler(例如 3 行)的映射。你的
onCreateViewHolder、getItemViewType和onBindViewHolder逻辑已经偏离了。 -
@CSmith 你能解释一下吗?
标签: android android-recyclerview chat adapter