为何RecyclerView搭配Paging3使用LoadStateAdapter作页脚时列表打开位置错误
解决方案
方案1:关闭分页占位符(最快解决,绝大多数场景适用)
你当前分页配置开启了enablePlaceholders = true,占位符和LoadStateAdapter组合会触发ConcatAdapter的锚点计算bug,直接关闭占位符即可修复:
// Repo层PagingConfig修改 val pagingConfig = PagingConfig( pageSize = 30, enablePlaceholders = false // 关闭占位符 )
方案2:保留占位符的前提下修复
如果你的业务需要展示占位符,可通过给ConcatAdapter开启隔离稳定ID解决:
- 首先给你的主业务Adapter和自定义
SomeLoadStateAdapter都开启稳定ID:
// 主Adapter初始化时调用 someAdapter.setHasStableIds(true) // LoadStateAdapter初始化时调用 footerAdapter.setHasStableIds(true) // 同时重写两个Adapter的getItemId方法,返回对应位置的唯一标识
- 手动构造ConcatAdapter替代默认的
withLoadStateFooter方法:
val concatConfig = ConcatAdapter.Config.Builder() .setStableIdMode(ConcatAdapter.Config.StableIdMode.ISOLATED_STABLE_IDS) .build() // 仅加页脚就传入主Adapter + 页脚Adapter,需要加页眉就把页眉Adapter放在最前面 val finalAdapter = ConcatAdapter(concatConfig, someAdapter, footerAdapter) binding.recyclerView.adapter = finalAdapter
补充兜底方案
如果上述方案仍不生效,可在PagingData提交后手动滚动到列表顶部:
lifecycleScope.launch { newPagingDataFlow().collectLatest { pagingData -> someAdapter.submitData(pagingData) // 提交完成后滚动到第0位 binding.recyclerView.scrollToPosition(0) } }
内容的提问来源于stack exchange,提问作者MobileAppBrewer
相关产品推荐
相关产品推荐

