yuliskov/SmartTube · error · IllegalArgumentException
You can't set adapter to MessagesList. Use #setAdapter(Messa
Error message
You can't set adapter to MessagesList. Use #setAdapter(MessagesListAdapter) instead.
What it means
MessagesList is a styled RecyclerView that only accepts MessagesListAdapter. The library overrides RecyclerView.setAdapter(Adapter) to throw IllegalArgumentException immediately and steer you to the typed overload setAdapter(MessagesListAdapter), which additionally enables smooth scrolling. The throw is synchronous at the call site.
Source
Thrown at chatkit/src/main/java/com/stfalcon/chatkit/messages/MessagesList.java:56
}
public MessagesList(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
parseStyle(context, attrs);
}
public MessagesList(Context context, @Nullable AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
parseStyle(context, attrs);
}
/**
* Don't use this method for setting your adapter, otherwise exception will by thrown.
* Call {@link #setAdapter(MessagesListAdapter)} instead.
*/
@Override
public void setAdapter(Adapter adapter) {
throw new IllegalArgumentException("You can't set adapter to MessagesList. Use #setAdapter(MessagesListAdapter) instead.");
}
/**
* Sets adapter for MessagesList
*
* @param adapter Adapter. Must extend MessagesListAdapter
* @param <MESSAGE> Message model class
*/
public <MESSAGE extends IMessage>
void setAdapter(MessagesListAdapter<MESSAGE> adapter) {
setAdapter(adapter, true);
}
/**
* Sets adapter for MessagesList
*
* @param adapter Adapter. Must extend MessagesListAdapter
* @param reverseLayout weather to use reverse layout for layout manager.View on GitHub (pinned to 3de8d90593)
Solutions
- Call the typed overload: messagesList.setAdapter(new MessagesListAdapter<>(senderId, holders))
- Declare your adapter variable as MessagesListAdapter<MESSAGE>, not Adapter
- Remove framework/testing code that sets a generic adapter on the list
Example fix
// before RecyclerView.Adapter adapter = new MyOldAdapter(); messagesList.setAdapter(adapter); // throws IllegalArgumentException // after MessagesListAdapter<IMessage> adapter = new MessagesListAdapter<>(senderId, holders); messagesList.setAdapter(adapter);
Defensive patterns
Strategy: type-guard
Validate before calling
if (!(adapter instanceof MessagesListAdapter)) {
throw new IllegalArgumentException("MessagesList requires a MessagesListAdapter");
}
messagesList.setAdapter((MessagesListAdapter<?>) adapter); Type guard
static boolean isMessagesListAdapter(@Nullable Adapter a) {
return a instanceof MessagesListAdapter;
} Prevention
- Keep adapter variables typed as MessagesListAdapter<MESSAGE>
- Use the typed setAdapter overload exclusively in chat screens
When it happens
Trigger: Calling messagesList.setAdapter(adapter) where adapter is typed as RecyclerView.Adapter/Adapter (raw) or is any adapter that is not a MessagesListAdapter — the same overload-resolution trap as DialogsList.
Common situations: Converting an existing RecyclerView screen to MessagesList while keeping the old setAdapter wiring; Kotlin code where the variable's declared type binds to the base overload; generic test harnesses injecting adapters via the base signature.
Related errors
- You can't set adapter to DialogsList. Use #setAdapter(Dialog
- Wrong message view type. Please, report this issue on GitHub
- You must pass either Activity, Fragment or SupportFragment
- content type must be greater or less than '0'!
- Somehow we couldn't create the ViewHolder for message. Pleas
AI-assisted analysis of yuliskov/SmartTube@3de8d90593 (2026-08-22).
Data as JSON: /api/errors/ea8a1c3d09d16d9c.
Report an issue: GitHub.