Android Paging3未调用PageDataSource,LiveData始终返回空值求助
问题根源及修复方案
1. ViewModel中错误的LiveData使用方式
你在ViewModel里直接调用response.value获取PagingData的方式完全错误。Paging3返回的LiveData<PagingData>是冷流,只有当UI层通过observe方法观察这个LiveData时,才会触发PagingSource的load方法执行数据加载。你现在直接取value,此时还没有任何观察者,所以PagingSource根本不会被初始化和调用,自然返回null。
修复ViewModel代码:
不要把Paging的LiveData包装成Resource后直接赋值,而是直接将Repository返回的LiveData暴露给UI层:
// ViewModel中定义可观察的LiveData val searchResult: LiveData<PagingData<MyDataModel>> = MutableLiveData() fun performSearch(searchKey: String) { searchResult = repo.getSearchResult(searchKey) }
然后在UI层(比如Activity/Fragment)中观察这个LiveData并提交给适配器:
viewModel.searchResult.observe(this) { pagingData -> adapter.submitData(lifecycle, pagingData) }
如果一定要用Resource包装,需通过collect观察Paging的LiveData:
val searchResult = MutableLiveData<Resource<PagingData<MyDataModel>>>() fun performSearch(searchKey: String) { viewModelScope.launch { searchResult.value = Resource.loading(null) repo.getSearchResult(searchKey).collect { pagingData -> searchResult.value = Resource.success(pagingData) } } }
2. PagingSource中的语法错误
你的MyPageDataSource的load方法里,when表达式的分支使用了减号-而非箭头->,这会导致编译或逻辑异常,也是PagingSource无法正常执行的潜在原因。
修复MyPageDataSource的when分支:
when (response) { is SearchResult.Success -> { nextKey = if (response.result.searchRes.isEmpty()) { null } else { page + (params.loadSize / NETWORK_PAGE_SIZE) } LoadResult.Page( data = response.result.searchRes, prevKey = if (page == INITIAL_LOAD_SIZE) null else page - 1, nextKey = nextKey ) } is SearchResult.NoResultFound -> { nextKey = null LoadResult.Page( data = emptyList(), prevKey = if (page == INITIAL_LOAD_SIZE) null else page - 1, nextKey = nextKey ) } is SearchResult.ServerError -> { val exception = Exception(response.message) LoadResult.Error(exception) } }
3. 初始化页码的潜在问题
检查INITIAL_LOAD_SIZE的定义,通常分页初始页码应为1,若设置不合理会导致第一页加载异常:
private const val INITIAL_LOAD_SIZE = 1
总结
核心问题是ViewModel中错误地直接获取冷LiveData的value,导致PagingSource从未被触发。修复后,只要UI层正确观察LiveData,PagingSource的load方法就会被调用,分页功能就能正常工作。
内容的提问来源于stack exchange,提问作者YBDevi
相关产品推荐
相关产品推荐

