1.引用paging3的依賴
def paging_version = "3.0.0-alpha03"
implementation "androidx.paging:paging-runtime:$paging_version"
2.大概的流程圖
流程圖.jpg
由圖可知要用paging來分頁的話是adapter是要繼承PagingDataAdapter或者LoadStateAdapter,目前以PagingDataAdapter為例子用踩。
PagingDataAdapter是通過submitData(PagingData)函數(shù)來提交數(shù)據(jù)到adapter,那么彩届,PagingData又是如何獲得呢? 由圖可知是通過Pager(PagingConfig(size)) {PageKeyedPagingSource()}.flow 獲得 Flow<PagingData>類型的對(duì)象,然后通過kotlin協(xié)程的flow.collectLatest {adapter.submitData(it)}函數(shù)進(jìn)行數(shù)據(jù)的訂閱绢掰。
Fragment的adapter數(shù)據(jù)提交代碼:
lifecycleScope.launchWhenCreated {
homeViewModel.flowData.collectLatest {
homeAdapter.submitData(it)
}
}
viewModel獲取 Flow<PagingData>的代碼部分:
class HomeViewModel : ViewModel() {
private val _homeRepository = HomeRepository()
val flowData: Flow<PagingData<HomePageRecommend.Item>> =_homeRepository.getFlowPageData()
}
HomeRepository類代碼
class HomeRepository {
fun getFlowPageData(): Flow<PagingData<HomePageRecommend.Item>> {
return Pager(PagingConfig(20)) {
PageKeyedPagingSource()
}.flow
}
}
PageKeyedPagingSource 跟 網(wǎng)絡(luò)接口的定義的 代碼的實(shí)現(xiàn):
class PageKeyedPagingSource : PagingSource<String, HomePageRecommend.Item>() {
override suspend fun load(params: LoadParams<String>): LoadResult<String, HomePageRecommend.Item> {
return try {
val page = params.key?:"http://baobab.kaiyanapp.com/api/v5/index/tab/allRec"
//獲取網(wǎng)絡(luò)數(shù)據(jù)
val result:HomePageRecommend = api.getHomePageRecommend(page)
LoadResult.Page(
//需要加載的數(shù)據(jù)
data = result.itemList,
//如果可以往上加載更多就設(shè)置該參數(shù)英染,否則不設(shè)置
prevKey = null,
//加載下一頁的key 如果傳null就說明到底了
nextKey = if(TextUtils.isEmpty(result.nextPageUrl)|| !result.nextPageUrl?.contains("adIndex")!!) null else result.nextPageUrl
)
}catch (e:Exception){
LoadResult.Error(e)
}
}
}
interface KaiyanApiInterface {
@GET
suspend fun getHomePageRecommend(@Url url:String): HomePageRecommend
}
這里的 val page = params.key?:"http://baobab.kaiyanapp.com/api/v5/index/tab/allRec" 為什么是這樣寫呢搪锣?這是根據(jù)后臺(tái)的返回?cái)?shù)據(jù)定義的。由于這里的下一頁的數(shù)據(jù)獲取是根據(jù)上一次后臺(tái)返回的result.nextPageUrl來獲得盔沫。
代碼地址