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

  1. Call the typed overload: messagesList.setAdapter(new MessagesListAdapter<>(senderId, holders))
  2. Declare your adapter variable as MessagesListAdapter<MESSAGE>, not Adapter
  3. 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

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


AI-assisted analysis of yuliskov/SmartTube@3de8d90593 (2026-08-22). Data as JSON: /api/errors/ea8a1c3d09d16d9c. Report an issue: GitHub.