【问题标题】:Jetpack Paging 3.0 with Airbnb/epoxy only load the first page带有 Airbnb/epoxy 的 Jetpack Paging 3.0 仅加载第一页
【发布时间】:2022-08-14 16:05:55
【问题描述】:

我正在尝试使用 Jetpack Paging 3.0 使用改造来获取 Rick and Morty API 中的所有字符,并使用 Airbnb/epoxy 显示它。但是我只得到了我花了几个小时试图寻找解决方案但没有运气的第一页。

链接到 API(Rick and Morty API)

代码:

1改造

@GET(\"character/\")
suspend fun getAllCharactersByPage(
    @Query(\"page\") pageIndex : Int
): Response<GetAllCharactersByPageResponse>

[2] 寻呼源

class AllCharacterPagingSource(
private val repository: AllCharactersRepository) : PagingSource<Int, Character>() {
override suspend fun load(
    params: LoadParams<Int>
): LoadResult<Int, Character> {

    val pageNumber = params.key ?: 1
    val prevKey = if (pageNumber == 1) null else pageNumber + 1

    val response = NetworkLayer.apiClient.getAllCharactersByPage(pageNumber)
    response.getException?.let {
      return LoadResult.Error(it)
    }

    return LoadResult.Page(
        data = response.body.results.map { CharacterMapper.buildFrom(it) },
        prevKey = prevKey,
        nextKey = getPageIndexFromNext(response.body.info.next)
    )
}

override fun getRefreshKey(state: PagingState<Int, Character>): Int? {
    return state.anchorPosition?.let {
        state.closestPageToPosition(it)?.prevKey?.plus(1)
            ?: state.closestPageToPosition(it)?.nextKey?.minus(1)
    }
}

private fun getPageIndexFromNext(next: String?): Int?{
    return next?.split(\"?page=\")?.get(1)?.toInt()
}

}

[3] 视图模型(寻呼机)

class AllCharactersViewModel : ViewModel() {

private val repository = AllCharactersRepository()

val flow = Pager(
    PagingConfig(Constants.PAGE_SIZE, Constants.PREFETCH_SIZE, enablePlaceholders = false)
) {
    AllCharacterPagingSource(repository)
}.flow.cachedIn(viewModelScope)

}

[4] 片段(提交数据)

iewLifecycleOwner.lifecycleScope.launch {
        allCharactersViewModel.flow.collectLatest {
            pagingEpoxyController.submitData(it)
        }
    }

    binding.charactersEpoxyRecyclerView.setController(pagingEpoxyController)

[5] 环氧树脂控制器

class CharactersPagingEpoxyController :  PagingDataEpoxyController<Character>() {

var context : Context? = null

override fun buildItemModel(currentPosition: Int, item: Character?): EpoxyModel<*> {
    return CharacterCardModel(
            character = item!!,
            context = context!!,
            onClick = { characterId ->
            }
        ).id(\"characters_${item.id}\")
    }



data class CharacterCardModel(
    val character : Character,
    val context : Context,
    val onClick: (Int) -> Unit
) : ViewBindingKotlinModel<CharacterCardContainerModelBinding>(R.layout.character_card_container_model) {
    override fun CharacterCardContainerModelBinding.bind() {
        Glide.with(context)
            .load(character.image)
            .into(imageView)

        characterName.text = character.name
        mirroredCharacterName.text = character.name

    }
}

}

提前致谢!!!

  • Constants.PAGE_SIZE 的值是多少?

标签: kotlin mvvm android-paging-3 epoxy


【解决方案1】:

我猜 prevKey 应该是这样的

val previewPage= if (pageNumber ==1 ) null else pageNumber -1

【讨论】:

    猜你喜欢
    • 2020-12-12
    • 1970-01-01
    • 1970-01-01
    • 2021-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多