feat(chat): Nachrichten-Paginierung – initial 200, automatisches Laden beim Scroll ans obere Ende #113

Closed
opened 2026-05-18 19:22:51 +00:00 by jreinemann-euris · 0 comments
jreinemann-euris commented 2026-05-18 19:22:51 +00:00 (Migrated from github.com)

Problem

\getConversation()\ lädt alle Nachrichten eines Gesprächs ungefiltert als Flow. Bei langen Chats wächst die Liste unbegrenzt → Performance-Problem im LazyColumn.

Lösung: Cursor-basierte Paginierung mit Auto-Load beim Scroll

Warum Cursor, nicht OFFSET?

Bei OFFSET verschiebt sich die Seite, wenn während der Sitzung neue Nachrichten eintreffen → Duplikate/Lücken. Cursor (\sent_at < :before) ist stabil.

Verhalten

  • Initial: Letzte 200 Nachrichten (neueste) werden geladen.
  • Beim Scrollen nach oben bis ans Ende: Wenn \ irstVisibleItemIndex == 0\ und noch ältere Nachrichten existieren → automatisch 200 weitere laden (kein Button, kein Tap nötig).
  • Während des Ladens: Oben in der Liste ein \CircularProgressIndicator.
  • Scroll-Position bleibt stabil – kein Sprung beim Nachladen.
  • Neue eingehende Nachrichten erscheinen weiterhin reaktiv unten (Flow bleibt erhalten).

Technische Umsetzung

1. \MessageDao.kt\ – neue Methoden

\\kotlin
// Neueste N Nachrichten als Live-Flow (ersetzt getConversation für den Chat)
@Query(" \

## Problem \getConversation()\ lädt **alle** Nachrichten eines Gesprächs ungefiltert als Flow. Bei langen Chats wächst die Liste unbegrenzt → Performance-Problem im LazyColumn. ## Lösung: Cursor-basierte Paginierung mit Auto-Load beim Scroll ### Warum Cursor, nicht OFFSET? Bei OFFSET verschiebt sich die Seite, wenn während der Sitzung neue Nachrichten eintreffen → Duplikate/Lücken. Cursor (\sent_at < :before\) ist stabil. ### Verhalten - **Initial:** Letzte 200 Nachrichten (neueste) werden geladen. - **Beim Scrollen nach oben bis ans Ende:** Wenn \ irstVisibleItemIndex == 0\ und noch ältere Nachrichten existieren → automatisch 200 weitere laden (kein Button, kein Tap nötig). - **Während des Ladens:** Oben in der Liste ein \CircularProgressIndicator\. - **Scroll-Position bleibt stabil** – kein Sprung beim Nachladen. - **Neue eingehende Nachrichten** erscheinen weiterhin reaktiv unten (Flow bleibt erhalten). --- ## Technische Umsetzung ### 1. \MessageDao.kt\ – neue Methoden \\\kotlin // Neueste N Nachrichten als Live-Flow (ersetzt getConversation für den Chat) @Query(" \\
Sign in to join this conversation.
No description provided.