I am showing media data (10k to 2L thumbnails) in a grid view, issue is observed sometimes(not always) when we do fast scroll on recycler view. Data fails to load and two scenario happens: 1.No events logged in galleryAdapter.addLoadStateListener and galleryAdapter.addOnPagesUpdatedListener 2. Keeps getting events in above listeners without stop, even not scrolling list.
DB query:
@Query("SELECT * from MediaInfo order by creationDate DESC")
fun getAllMediaPaged(): PagingSource<Int, MediaInfo>
ViewModel:
var currentResult: Flow<PagingData<MediaItem>>? = null
fun getMediaItemsPaged(): Flow<PagingData<MediaItem>> {
val lastResult = currentResult
if (lastResult != null)
return lastResult
val newResult: Flow<PagingData<MediaItem>> = Pager(
PagingConfig(
pageSize = 200,
prefetchDistance = 200,
maxSize= 200 + (2 * 200),
jumpThreshold = 100
)
) {
localDataSource.getAllMediaPaged()
}.flow
.map { pagingMediaInfo ->
pagingMediaInfo
.map { mediaInfo ->
MediaItem.MediaSectionItem(
sectionName = mediaInfo.header,
mediaInfo = mediaInfo
)
}
.insertSeparators { before:MediaItem?, after:MediaItem? ->
insertHeader(before, after)
}
}.cachedIn(viewModelScope)
currentResult = newResult
return newResult
}
Fragment:
private fun getMediaItems(galleryAdapter: GalleryAdapter) {
lifecycleScope.launch {
viewModel.getMediaItemsPaged().collectLatest {
galleryAdapter.submitData(lifecycle, it)
}
}
}