2

我正在尝试从图库中获取所有图像并将它们显示在回收站视图中。要获取图像,我正在使用 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

4

0 回答 0