diff --git a/app/src/main/java/com/gh/gamecenter/home/custom/CustomPageViewModel.kt b/app/src/main/java/com/gh/gamecenter/home/custom/CustomPageViewModel.kt index 2bdcb9cad2..58629c7b76 100644 --- a/app/src/main/java/com/gh/gamecenter/home/custom/CustomPageViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/home/custom/CustomPageViewModel.kt @@ -93,7 +93,12 @@ class CustomPageViewModel( private var searchToolbarTabWrapperViewModel: SearchToolbarTabWrapperViewModel? = null - private val subjectChangedMap: ArrayMap> = ArrayMap() + private val subjectChangedMap: ArrayMap> = ArrayMap() + + /** + * 微信CPM专题当前的页码记录 + */ + private val cpmSubjectChangedPageMap: ArrayMap = ArrayMap() var slideDiscoveryGamesPage = -1 @@ -358,9 +363,68 @@ class CustomPageViewModel( } } - override fun onChangeABatch(subjectEntity: SubjectEntity) { + override fun onChangeABatch(subjectEntity: SubjectEntity) = + if (subjectEntity.isWechatColumnCPM) { + onChangeWGameCPMABatch(subjectEntity) + } else { + onChangeNormalGameABatch(subjectEntity) + } + + /** + * 微信小游戏CPM的“换一批”功能实现 + * + * @see 【光环助手】CPM微信小游戏“换一批”功能优化 + */ + private fun onChangeWGameCPMABatch(subjectEntity: SubjectEntity) { val subjectId = subjectEntity.id ?: return - val gameList = subjectChangedMap[subjectId] + val page = cpmSubjectChangedPageMap[subjectId] ?: let { + // 第一次点击“换一批”时,先缓存第一页的数据 + subjectChangedMap[SubjectChanged(subjectId, 1)] = subjectEntity.data + 2 + } + val subjectChanged = SubjectChanged(subjectId, page) + val gameList = subjectChangedMap[subjectChanged] + if (gameList != null) {// 直接读取缓存数据 + notifyWGameCPMABatchChanged(gameList, subjectId, page) + } else { + repository.loadChangeSubjectWGameCPM(page) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(object : Response>() { + override fun onResponse(response: List?) { + if (response != null) { + subjectChangedMap[subjectChanged] = response + notifyWGameCPMABatchChanged(response, subjectId, page) + } + } + + override fun onFailure(e: HttpException?) { + Utils.toast(getApplication(), "网络异常") + } + }) + } + } + + private fun notifyWGameCPMABatchChanged(gameList: List, subjectId: String, page: Int) { + val nextPage: Int + val cpmGameList = if(gameList.isEmpty()) { + nextPage = 1// 已经到最后一页了,下一页是第一页 + subjectChangedMap[SubjectChanged(subjectId, 1)]!! + } else { + nextPage = page + 1 + gameList + } + cpmSubjectChangedPageMap[subjectId] = nextPage// 加载下一页数据 + changeSubjectCustomPageItem(subjectId, ArrayList(cpmGameList)) + } + + /** + * 光环游戏的“换一批”功能实现 + */ + private fun onChangeNormalGameABatch(subjectEntity: SubjectEntity) { + val subjectId = subjectEntity.id ?: return + val subjectChanged = SubjectChanged(subjectId, 2) + val gameList = subjectChangedMap[subjectChanged] if (gameList != null) { changeSubjectCustomPageItem(subjectId, getRandomGameList(subjectEntity.data, ArrayList(gameList))) } else { @@ -370,7 +434,7 @@ class CustomPageViewModel( .subscribe(object : Response>() { override fun onResponse(response: List?) { if (response != null) { - subjectChangedMap[subjectId] = response + subjectChangedMap[subjectChanged] = response onChangeABatch(subjectEntity) } } @@ -760,5 +824,26 @@ class CustomPageViewModel( repository.onClear() } + class SubjectChanged( + val subjectId: String, + val page: Int + ) { + companion object { + private const val HASH = 30 + } + + override fun hashCode(): Int { + return subjectId.hashCode() + page.hashCode() + HASH + } + + override fun equals(other: Any?): Boolean { + if (other !is SubjectChanged) { + return false + } + return other.subjectId == subjectId + && other.page == page + } + + } } \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/home/custom/model/CustomPageRepository.kt b/app/src/main/java/com/gh/gamecenter/home/custom/model/CustomPageRepository.kt index a311f1bab5..e6c5761933 100644 --- a/app/src/main/java/com/gh/gamecenter/home/custom/model/CustomPageRepository.kt +++ b/app/src/main/java/com/gh/gamecenter/home/custom/model/CustomPageRepository.kt @@ -805,11 +805,13 @@ class CustomPageRepository private constructor( } fun loadChangeSubjectGame(subjectEntity: SubjectEntity): Observable> = - if (subjectEntity.isWechatColumnCPM) {// 微信小游戏CPM专题的“换一批”接口 - wGameSubjectCPMRemoteDataSource.getEditorRecommendCPMList(2, 10).toObservable() - } else { - remoteDataSource.loadChangeSubjectGame(subjectEntity) - } + remoteDataSource.loadChangeSubjectGame(subjectEntity) + .map(RegionSettingHelper.filterGame) + .map(ApkActiveUtils.filterMapperList) + + fun loadChangeSubjectWGameCPM(page: Int): Observable> = + wGameSubjectCPMRemoteDataSource.getEditorRecommendCPMList(page, 10)// 微信小游戏CPM专题的“换一批”接口 + .toObservable() .map(RegionSettingHelper.filterGame) .map(ApkActiveUtils.filterMapperList)