kotlin的分页中如何先更新100条临时数据然后只更新显示的部分数据

问题描述 投票:0回答:1

有没有办法在kotlin分页中先更新100条临时数据,然后只更新显示的部分数据?

准备好100个临时数据后,我们可以通过sync得到100个普通数据并更新它们,但这会浪费处理,所以我们只想更新和描述数据的显示部分。

PAGING中有这样的功能吗?

如果我先将假数据放入uiState中,然后运行实际的数据采集过程,则会丢失100个临时数据。

我想将数据总数显示为100。

class PagingSourceViewModel @Inject constructor(
private val moviesRepository: MoviesRepository
) : ViewModel() {
data class UiState(
val pagingDataFlow: PagingData\<Movie\> = PagingData.empty(),
val isLoading: Boolean = false,
val errorMessage: String? = null
)

    // UiStateを保持するStateFlow
    private val _uiState = MutableStateFlow(UiState())
    val uiState: StateFlow<UiState> = _uiState
    private val intList = Array(100) { it }
    private val startPosition = 99
    fun load() {
        // 最初に仮データを設定
        loadFakeData()
    
        // 実際のデータを後から取得
        fetchMovies()
    }
    
    private fun loadFakeData() {
        // 仮データとして100件を設定
        val fakeMovies = List(intList.size) { index ->
            Movie(
                id = index.toLong(), title = "Fake Movie $index",
                description = "description",
                cardImageUrl = MoviePagingSource.IMAGE_URL,
                backgroundImageUrl = MoviePagingSource.ALTERNATE_IMAGE_URL,
            )
        }
    
        // 仮データをPagingDataに変換して送信
        _uiState.update {
            it.copy(
                pagingDataFlow = PagingData.from(fakeMovies),
                isLoading = true,
                errorMessage = null
            )
        }
    }
    
    private fun fetchMovies() {
        viewModelScope.launch {
            // 実際のデータを取得(例えばAPIから)
            moviesRepository.getMovies(startPosition = startPosition, intList = intList).collectLatest { pagingData ->
                
                // 実際のデータで更新
                _uiState.update {
                    it.copy(
                        pagingDataFlow = pagingData,
                        isLoading = true,
                        errorMessage = null
                    )
                }
            }
        }
    }
}
kotlin pagination android-paging android-paging-3 android-paging-library
1个回答
0
投票

您可以使用占位符来实现这一点。您必须首先在分页配置中启用它们:

Pager(
  config = PagingConfig(
    pageSize = 10,
    initialLoadSize = 20,
    prefetchDistance = 10,
    enablePlaceholders = true,
  ),
  initialKey = null,
  ...
)

然后在您的

PagingSource
中,您必须始终返回正确的
itemsBefore
itemsAfter
计数:

override suspend fun load(params: LoadParams<Int>): LoadResult<Int, Data> {
  val page = params.key

  if (page == null) {
    // at first, return empty data with itemsAfter = 100,
    // so you immediately get 100 placeholders without delay
    return LoadResult.Page(
      data = emptyList(),
      prevKey = null,
      nextKey = 1,
      itemsBefore = 0,
      itemsAfter = 100,
    )
  } else {
    // then you always load current page and count correct value for
    // itemsBefore and itemsAfter
    val data = loadPage(page) // todo: handle loading errors...
    return LoadResult.Page(
      data = data,
      prevKey = if (page == 1) null else page - 1,
      nextKey = page + 1,
      itemsBefore = (page - 1) * params.loadSize,
      itemsAfter = 100 - page * params.loadSize,
    )
  }
}

有了这个,你应该得到的分页列表总是有 100 个项目,但是那些尚未加载的项目将是

null
- 你在那里显示你的假数据。

© www.soinside.com 2019 - 2024. All rights reserved.