# 10. Pagination & List Performance meta: id: android-production-10 feature: android-production priority: P2 depends_on: [] tags: [performance, lists, production] objective: - Implement pagination and optimize list performance to prevent ANRs and jank on large datasets deliverables: - Pagination for all list endpoints - LazyColumn optimization - DiffUtil or Compose lazy list optimization - ANR prevention steps: 1. Implement pagination: - Add pagination to tRPC list endpoints (if not already) - Use Paging 3 library for Jetpack Compose - Configure page size (20-50 items) - Add pagination parameters to API calls 2. Optimize LazyColumn: - Use key parameter for item stability - Use contentType for different item types - Avoid unnecessary recompositions - Use remember for expensive calculations 3. Add loading states: - Skeleton placeholders while loading first page - Load more indicator at bottom - Empty state for no data - Error state with retry 4. Optimize data flow: - Use Flow/PagingData in ViewModels - CollectAsStateWithLifecycle for Compose - Avoid collecting flows in composables directly 5. Prevent ANRs: - Move heavy calculations to background threads - Use viewModelScope for coroutines - Avoid blocking main thread - Profile with Android Profiler 6. Add tests: - Test pagination boundaries - Test scroll performance - Test memory usage with large lists tests: - Unit: Test pagination logic - Performance: Scroll test with 1000+ items - ANR: Profile main thread during list operations acceptance_criteria: - All lists paginated (20-50 items per page) - Paging 3 library used for Compose integration - LazyColumn with key and contentType optimization - Skeleton placeholders on initial load - Load more indicator on scroll - Empty and error states handled - No ANRs during list operations - 60fps scrolling on lists >100 items - Memory stable during list scrolling - Unit tests for pagination logic validation: - Scroll through alert list → smooth 60fps - Scroll to bottom → next page loads automatically - Check Android Profiler → no main thread blocking - Memory monitor → stable during scrolling - Test with 1000 items → no ANR, no OOM notes: - Paging 3 is the modern standard for Android pagination - ANRs on lists are often caused by blocking main thread - Use LazyColumn, not Column, for long lists - Test on low-end devices (Android 10, 2GB RAM)