我正在尝试从图库中获取所有图像并将它们显示在回收站视图中。要获取图像,我正在使用 Paging 3 Library。当我从上到下滚动时,一切工作正常我得到所有带有分页的图像,但是当我向上滚动(从下到上)时,我只是陷入了一个循环。Paging3 一次又一次地获取相同的图像。
这是我的加载方法:
override suspend fun load(params: LoadParams<Int>): LoadResult<Int, ImagesData> {
val position = params.key ?: STARTING_PAGE_INDEX
return try {
val photos : ArrayList<ImagesData> = ArrayList()
imagesDataSource.loadImagesFromStorage(position, params.loadSize).collect {
photos.addAll(it)
}
LoadResult.Page(
data = photos,
prevKey = if (position == STARTING_PAGE_INDEX) null else position,
nextKey = if (photos.isEmpty()) null else position + params.loadSize
)
} catch (exception: Exception) {
LoadResult.Error(exception)
}
}
这是我的 loadImagesFromStorage 函数:
suspend fun loadImagesFromStorage(
prevIndex : Int,
pageSize : Int
) : Flow<List<ImagesData>> = flow {
val uri: Uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI
val cursor: Cursor?
val columnIndexId: Int
val listOfAllImages = mutableListOf<ImagesData>()
val projection = arrayOf(MediaStore.Images.Media._ID)
val orderBy = MediaStore.Images.Media.DATE_TAKEN
try {
cursor = context.contentResolver
.query(
uri,
projection,
null,
null,
"$orderBy DESC")
cursor?.let {
cursor.moveToPosition(prevIndex)
columnIndexId = cursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID)
while (cursor.moveToNext() && cursor.position < (prevIndex + pageSize)){
val contentUri = ContentUris.withAppendedId(uri, cursor.getLong(columnIndexId))
listOfAllImages.add(ImagesData(contentUri))
}
cursor.close()
}
} catch (e : Exception) {
Log.e(TAG, "loadImagesFromStorage: ",e )
}
emit(listOfAllImages)
}.flowOn(Dispatchers.IO).catch { e ->
Log.e(TAG, "loadImagesFromStorage: ", e)
}
分页逻辑很简单,我第一次将光标移动到最后一个位置,它将为-1,然后无论页面大小是什么,它都会根据该大小增加。并且 Cursor 获取数据,直到它具有值并且光标位置小于PageSize + Position。