I have a ConcatAdapter
that uses one PagingDataAdapter
(wrapped by its own ConcatAdapter
by calling withLoadStateFooter
and a normal ListAdapter
):
val concatAdapter = ConcatAdapter(
newChatMessagesAdapter, // this is a ListAdapter
chatMessagesHistoryAdapter.withLoadStateFooter(
ListLoadStateAdapter(chatMessagesHistoryAdapter::retry)
) // this is another ConcatAdapter (that contains a PagingDataAdapter)
)
Both the newChatMessageAdapter
and the chatMessageHistoryAdapter
have multiple view types, but both adapters have the exact same ones:
// newChatMessagesAdapter and chatMessagesHistoryAdapter both contain this code:
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
val message = getItem(position)
if (message != null) {
when (holder.itemViewType) {
R.layout.item_chat_message_outgoing_first -> {
(holder as ChatMessageOutgoingFirstViewHolder).bind(message)
}
R.layout.item_chat_message_outgoing_following -> {
(holder as ChatMessageOutgoingFollowingViewHolder).bind(message)
}
R.layout.item_chat_message_incoming_first -> {
(holder as ChatMessageIncomingFirstViewHolder).bind(message, isGroupChat)
}
R.layout.item_chat_message_incoming_following -> {
(holder as ChatMessageIncomingFollowingViewHolder).bind(message)
}
}
}
}
override fun getItemViewType(position: Int): Int {
val currentItem = getItem(position)
val previousItem = if (position != itemCount - 1) getItem(position + 1) else null
return if (currentItem?.senderUid == currentUserUid) {
if (previousItem == null || previousItem.senderUid != currentItem.senderUid) {
R.layout.item_chat_message_outgoing_first
} else {
R.layout.item_chat_message_outgoing_following
}
} else {
if (previousItem == null || previousItem.senderUid != currentItem?.senderUid) {
R.layout.item_chat_message_incoming_first
} else {
R.layout.item_chat_message_incoming_following
}
}
}
When I start my app, all views are empty, because no itemViewType
matches in onBindViewHolder
. It works if I remove withLoadStateFooter
(which turns the 2nd ConcatAdapter into my own PagingDataAdapter
) and add ConcatAdapter.Config.Builder().setIsolateViewTypes(false).build()
, probably because both adapters have the exact same viewTypes
. However, as soon as I add withLoadStateFooter
this stops working as well and I am back at empty view holders.
So in a nutshell, my question is: How can I use different viewTypes
in my adapters that are combined inside a ConcatAdapter
?